Skip to content

Commit 7ba1a0e

Browse files
authored
Add enable extensions for ray queries and ray query vertex returns. (#8545)
1 parent 853ad6c commit 7ba1a0e

File tree

17 files changed

+222
-2
lines changed

17 files changed

+222
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ By @SupaMaggie70Incorporated in [#8206](https://github.com/gfx-rs/wgpu/pull/8206
115115

116116
#### General
117117

118+
- Require new enable extensions when using ray queries and position fetch (`wgpu_ray_query`, `wgpu_ray_query_vertex_return`). By @Vecvec in [#8545](https://github.com/gfx-rs/wgpu/pull/8545).
118119
- Lower `max_blas_primitive_count` due to a bug in llvmpipe. By @Vecvec in [#8446](https://github.com/gfx-rs/wgpu/pull/8446).
119120
- Texture now has `from_custom`. By @R-Cramer4 in [#8315](https://github.com/gfx-rs/wgpu/pull/8315).
120121
- Using both the wgpu command encoding APIs and `CommandEncoder::as_hal_mut` on the same encoder will now result in a panic.

examples/features/src/ray_cube_compute/shader.wgsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct RayIntersection {
4040
world_to_object: mat4x3<f32>,
4141
}
4242
*/
43+
enable wgpu_ray_query;
4344

4445
struct Uniforms {
4546
view_inv: mat4x4<f32>,

examples/features/src/ray_cube_fragment/shader.wgsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
enable wgpu_ray_query;
2+
13
struct VertexOutput {
24
@builtin(position) position: vec4<f32>,
35
@location(0) tex_coords: vec2<f32>,

examples/features/src/ray_cube_normals/shader.wgsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ struct RayIntersection {
3939
world_to_object: mat4x3<f32>,
4040
}
4141
*/
42+
enable wgpu_ray_query;
43+
enable wgpu_ray_query_vertex_return;
4244

4345
struct Uniforms {
4446
view_inv: mat4x4<f32>,

examples/features/src/ray_scene/shader.wgsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
enable wgpu_ray_query;
2+
13
struct VertexOutput {
24
@builtin(position) position: vec4<f32>,
35
@location(0) tex_coords: vec2<f32>,

examples/features/src/ray_shadows/shader.wgsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
enable wgpu_ray_query;
2+
13
struct VertexOutput {
24
@builtin(position) position: vec4<f32>,
35
@location(0) tex_coords: vec2<f32>,

examples/features/src/ray_traced_triangle/shader.wgsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// duplicate of hal's ray-traced triangle shader
22

3+
enable wgpu_ray_query;
4+
35
struct Uniforms {
46
view_inv: mat4x4<f32>,
57
proj_inv: mat4x4<f32>,

naga/src/front/wgsl/parse/directive/enable_extension.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use alloc::boxed::Box;
1111
#[derive(Clone, Debug, Eq, PartialEq)]
1212
pub struct EnableExtensions {
1313
wgpu_mesh_shader: bool,
14+
wgpu_ray_query: bool,
15+
wgpu_ray_query_vertex_return: bool,
1416
dual_source_blending: bool,
1517
/// Whether `enable f16;` was written earlier in the shader module.
1618
f16: bool,
@@ -21,6 +23,8 @@ impl EnableExtensions {
2123
pub(crate) const fn empty() -> Self {
2224
Self {
2325
wgpu_mesh_shader: false,
26+
wgpu_ray_query: false,
27+
wgpu_ray_query_vertex_return: false,
2428
f16: false,
2529
dual_source_blending: false,
2630
clip_distances: false,
@@ -31,6 +35,10 @@ impl EnableExtensions {
3135
pub(crate) fn add(&mut self, ext: ImplementedEnableExtension) {
3236
let field = match ext {
3337
ImplementedEnableExtension::WgpuMeshShader => &mut self.wgpu_mesh_shader,
38+
ImplementedEnableExtension::WgpuRayQuery => &mut self.wgpu_ray_query,
39+
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
40+
&mut self.wgpu_ray_query_vertex_return
41+
}
3442
ImplementedEnableExtension::DualSourceBlending => &mut self.dual_source_blending,
3543
ImplementedEnableExtension::F16 => &mut self.f16,
3644
ImplementedEnableExtension::ClipDistances => &mut self.clip_distances,
@@ -42,6 +50,10 @@ impl EnableExtensions {
4250
pub(crate) const fn contains(&self, ext: ImplementedEnableExtension) -> bool {
4351
match ext {
4452
ImplementedEnableExtension::WgpuMeshShader => self.wgpu_mesh_shader,
53+
ImplementedEnableExtension::WgpuRayQuery => self.wgpu_ray_query,
54+
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
55+
self.wgpu_ray_query_vertex_return
56+
}
4557
ImplementedEnableExtension::DualSourceBlending => self.dual_source_blending,
4658
ImplementedEnableExtension::F16 => self.f16,
4759
ImplementedEnableExtension::ClipDistances => self.clip_distances,
@@ -75,6 +87,8 @@ impl EnableExtension {
7587
const CLIP_DISTANCES: &'static str = "clip_distances";
7688
const DUAL_SOURCE_BLENDING: &'static str = "dual_source_blending";
7789
const MESH_SHADER: &'static str = "wgpu_mesh_shader";
90+
const RAY_QUERY: &'static str = "wgpu_ray_query";
91+
const RAY_QUERY_VERTEX_RETURN: &'static str = "wgpu_ray_query_vertex_return";
7892
const SUBGROUPS: &'static str = "subgroups";
7993
const PRIMITIVE_INDEX: &'static str = "primitive_index";
8094

@@ -87,6 +101,10 @@ impl EnableExtension {
87101
Self::Implemented(ImplementedEnableExtension::DualSourceBlending)
88102
}
89103
Self::MESH_SHADER => Self::Implemented(ImplementedEnableExtension::WgpuMeshShader),
104+
Self::RAY_QUERY => Self::Implemented(ImplementedEnableExtension::WgpuRayQuery),
105+
Self::RAY_QUERY_VERTEX_RETURN => {
106+
Self::Implemented(ImplementedEnableExtension::WgpuRayQueryVertexReturn)
107+
}
90108
Self::SUBGROUPS => Self::Unimplemented(UnimplementedEnableExtension::Subgroups),
91109
Self::PRIMITIVE_INDEX => {
92110
Self::Unimplemented(UnimplementedEnableExtension::PrimitiveIndex)
@@ -100,6 +118,10 @@ impl EnableExtension {
100118
match self {
101119
Self::Implemented(kind) => match kind {
102120
ImplementedEnableExtension::WgpuMeshShader => Self::MESH_SHADER,
121+
ImplementedEnableExtension::WgpuRayQuery => Self::RAY_QUERY,
122+
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
123+
Self::RAY_QUERY_VERTEX_RETURN
124+
}
103125
ImplementedEnableExtension::DualSourceBlending => Self::DUAL_SOURCE_BLENDING,
104126
ImplementedEnableExtension::F16 => Self::F16,
105127
ImplementedEnableExtension::ClipDistances => Self::CLIP_DISTANCES,
@@ -135,6 +157,10 @@ pub enum ImplementedEnableExtension {
135157
ClipDistances,
136158
/// Enables the `wgpu_mesh_shader` extension, native only
137159
WgpuMeshShader,
160+
/// Enables the `wgpu_ray_query` extension, native only.
161+
WgpuRayQuery,
162+
/// Enables the `wgpu_ray_query_vertex_return` extension, native only.
163+
WgpuRayQueryVertexReturn,
138164
}
139165

140166
/// A variant of [`EnableExtension::Unimplemented`].

naga/src/front/wgsl/parse/mod.rs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,15 +1930,87 @@ impl Parser {
19301930
}
19311931
}
19321932
"acceleration_structure" => {
1933+
if !lexer
1934+
.enable_extensions
1935+
.contains(ImplementedEnableExtension::WgpuRayQuery)
1936+
{
1937+
return Err(Box::new(Error::EnableExtensionNotEnabled {
1938+
kind: EnableExtension::Implemented(
1939+
ImplementedEnableExtension::WgpuRayQuery,
1940+
),
1941+
span,
1942+
}));
1943+
}
19331944
let vertex_return = lexer.next_acceleration_structure_flags()?;
1945+
if !lexer
1946+
.enable_extensions
1947+
.contains(ImplementedEnableExtension::WgpuRayQueryVertexReturn)
1948+
&& vertex_return
1949+
{
1950+
return Err(Box::new(Error::EnableExtensionNotEnabled {
1951+
kind: EnableExtension::Implemented(
1952+
ImplementedEnableExtension::WgpuRayQueryVertexReturn,
1953+
),
1954+
span,
1955+
}));
1956+
}
19341957
ast::Type::AccelerationStructure { vertex_return }
19351958
}
19361959
"ray_query" => {
1960+
if !lexer
1961+
.enable_extensions
1962+
.contains(ImplementedEnableExtension::WgpuRayQuery)
1963+
{
1964+
return Err(Box::new(Error::EnableExtensionNotEnabled {
1965+
kind: EnableExtension::Implemented(
1966+
ImplementedEnableExtension::WgpuRayQuery,
1967+
),
1968+
span,
1969+
}));
1970+
}
19371971
let vertex_return = lexer.next_acceleration_structure_flags()?;
1972+
if !lexer
1973+
.enable_extensions
1974+
.contains(ImplementedEnableExtension::WgpuRayQueryVertexReturn)
1975+
&& vertex_return
1976+
{
1977+
return Err(Box::new(Error::EnableExtensionNotEnabled {
1978+
kind: EnableExtension::Implemented(
1979+
ImplementedEnableExtension::WgpuRayQueryVertexReturn,
1980+
),
1981+
span,
1982+
}));
1983+
}
19381984
ast::Type::RayQuery { vertex_return }
19391985
}
1940-
"RayDesc" => ast::Type::RayDesc,
1941-
"RayIntersection" => ast::Type::RayIntersection,
1986+
"RayDesc" => {
1987+
if !lexer
1988+
.enable_extensions
1989+
.contains(ImplementedEnableExtension::WgpuRayQuery)
1990+
{
1991+
return Err(Box::new(Error::EnableExtensionNotEnabled {
1992+
kind: EnableExtension::Implemented(
1993+
ImplementedEnableExtension::WgpuRayQuery,
1994+
),
1995+
span,
1996+
}));
1997+
}
1998+
ast::Type::RayDesc
1999+
}
2000+
"RayIntersection" => {
2001+
if !lexer
2002+
.enable_extensions
2003+
.contains(ImplementedEnableExtension::WgpuRayQuery)
2004+
{
2005+
return Err(Box::new(Error::EnableExtensionNotEnabled {
2006+
kind: EnableExtension::Implemented(
2007+
ImplementedEnableExtension::WgpuRayQuery,
2008+
),
2009+
span,
2010+
}));
2011+
}
2012+
ast::Type::RayIntersection
2013+
}
19422014
_ => return Ok(None),
19432015
}))
19442016
}

naga/src/valid/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ impl Capabilities {
208208
// NOTE: `SHADER_FLOAT16_IN_FLOAT32` _does not_ require the `f16` extension
209209
Self::SHADER_FLOAT16 => Some(Ext::F16),
210210
Self::CLIP_DISTANCE => Some(Ext::ClipDistances),
211+
Self::RAY_QUERY => Some(Ext::WgpuRayQuery),
212+
Self::RAY_HIT_VERTEX_POSITION => Some(Ext::WgpuRayQueryVertexReturn),
211213
_ => None,
212214
}
213215
}

0 commit comments

Comments
 (0)