diff --git a/CHANGELOG.md b/CHANGELOG.md index fc094bcfb0..a9756151a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -107,6 +107,7 @@ By @bradwerth [#6216](https://github.com/gfx-rs/wgpu/pull/6216). - Fix type parameters to vec/mat type constructors to also support aliases. By @sagudev in [#6189](https://github.com/gfx-rs/wgpu/pull/6189). - Accept global `var`s without explicit type. By @sagudev in [#6199](https://github.com/gfx-rs/wgpu/pull/6199). - Fix handling of phony statements, so they are actually emitted. By @sagudev in [#6328](https://github.com/gfx-rs/wgpu/pull/6328). +- Added `gl_DrawID` to glsl and `DrawIndex` to spv. By @ChosenName in [#6325](https://github.com/gfx-rs/wgpu/pull/6325). #### General diff --git a/naga/src/back/glsl/features.rs b/naga/src/back/glsl/features.rs index 362f4bb4f3..74f48d8bc8 100644 --- a/naga/src/back/glsl/features.rs +++ b/naga/src/back/glsl/features.rs @@ -579,7 +579,7 @@ impl<'a, W> Writer<'a, W> { crate::BuiltIn::ViewIndex => { self.features.request(Features::MULTI_VIEW) } - crate::BuiltIn::InstanceIndex => { + crate::BuiltIn::InstanceIndex | crate::BuiltIn::DrawID => { self.features.request(Features::INSTANCE_INDEX) } _ => {} diff --git a/naga/src/back/glsl/mod.rs b/naga/src/back/glsl/mod.rs index 2ce9f22f27..ed373d00b0 100644 --- a/naga/src/back/glsl/mod.rs +++ b/naga/src/back/glsl/mod.rs @@ -238,7 +238,7 @@ bitflags::bitflags! { /// additional functions on shadows and arrays of shadows. const TEXTURE_SHADOW_LOD = 0x2; /// Supports ARB_shader_draw_parameters on the host, which provides - /// support for `gl_BaseInstanceARB`, `gl_BaseVertexARB`, and `gl_DrawIDARB`. + /// support for `gl_BaseInstanceARB`, `gl_BaseVertexARB`, `gl_DrawIDARB`, and `gl_DrawID`. const DRAW_PARAMETERS = 0x4; /// Include unused global variables, constants and functions. By default the output will exclude /// global variables that are not used in the specified entrypoint (including indirect use), @@ -4719,6 +4719,7 @@ const fn glsl_built_in(built_in: crate::BuiltIn, options: VaryingOptions) -> &'s } Bi::PointSize => "gl_PointSize", Bi::VertexIndex => "uint(gl_VertexID)", + Bi::DrawID => "gl_DrawID", // fragment Bi::FragDepth => "gl_FragDepth", Bi::PointCoord => "gl_PointCoord", diff --git a/naga/src/back/hlsl/conv.rs b/naga/src/back/hlsl/conv.rs index 473fc9476d..5345f0a4d6 100644 --- a/naga/src/back/hlsl/conv.rs +++ b/naga/src/back/hlsl/conv.rs @@ -178,7 +178,7 @@ impl crate::BuiltIn { Self::BaseInstance | Self::BaseVertex | Self::WorkGroupSize => { return Err(Error::Unimplemented(format!("builtin {self:?}"))) } - Self::PointSize | Self::ViewIndex | Self::PointCoord => { + Self::PointSize | Self::ViewIndex | Self::PointCoord | Self::DrawID => { return Err(Error::Custom(format!("Unsupported builtin {self:?}"))) } }) diff --git a/naga/src/back/msl/mod.rs b/naga/src/back/msl/mod.rs index 4bc06469e8..fbeaa4cc8d 100644 --- a/naga/src/back/msl/mod.rs +++ b/naga/src/back/msl/mod.rs @@ -568,7 +568,7 @@ impl ResolvedBinding { Bi::SubgroupId => "simdgroup_index_in_threadgroup", Bi::SubgroupSize => "threads_per_simdgroup", Bi::SubgroupInvocationId => "thread_index_in_simdgroup", - Bi::CullDistance | Bi::ViewIndex => { + Bi::CullDistance | Bi::ViewIndex | Bi::DrawID => { return Err(Error::UnsupportedBuiltIn(built_in)) } }; diff --git a/naga/src/back/spv/writer.rs b/naga/src/back/spv/writer.rs index 14f1fc0027..cd02c22195 100644 --- a/naga/src/back/spv/writer.rs +++ b/naga/src/back/spv/writer.rs @@ -1618,6 +1618,7 @@ impl Writer { Bi::InstanceIndex => BuiltIn::InstanceIndex, Bi::PointSize => BuiltIn::PointSize, Bi::VertexIndex => BuiltIn::VertexIndex, + Bi::DrawID => BuiltIn::DrawIndex, // fragment Bi::FragDepth => BuiltIn::FragDepth, Bi::PointCoord => BuiltIn::PointCoord, diff --git a/naga/src/back/wgsl/writer.rs b/naga/src/back/wgsl/writer.rs index e8b942a62c..f7555df0b0 100644 --- a/naga/src/back/wgsl/writer.rs +++ b/naga/src/back/wgsl/writer.rs @@ -1941,9 +1941,8 @@ fn builtin_str(built_in: crate::BuiltIn) -> Result<&'static str, Error> { | Bi::CullDistance | Bi::PointSize | Bi::PointCoord - | Bi::WorkGroupSize => { - return Err(Error::Custom(format!("Unsupported builtin {built_in:?}"))) - } + | Bi::WorkGroupSize + | Bi::DrawID => return Err(Error::Custom(format!("Unsupported builtin {built_in:?}"))), }) } diff --git a/naga/src/front/glsl/variables.rs b/naga/src/front/glsl/variables.rs index 16c5bb65d6..23a4141e97 100644 --- a/naga/src/front/glsl/variables.rs +++ b/naga/src/front/glsl/variables.rs @@ -202,6 +202,7 @@ impl Frontend { "gl_VertexIndex" => BuiltIn::VertexIndex, "gl_SampleID" => BuiltIn::SampleIndex, "gl_LocalInvocationIndex" => BuiltIn::LocalInvocationIndex, + "gl_DrawID" => BuiltIn::DrawID, _ => return Ok(None), }; diff --git a/naga/src/front/spv/convert.rs b/naga/src/front/spv/convert.rs index f131db616e..68b870fb01 100644 --- a/naga/src/front/spv/convert.rs +++ b/naga/src/front/spv/convert.rs @@ -139,6 +139,7 @@ pub(super) fn map_builtin(word: spirv::Word, invariant: bool) -> Result crate::BuiltIn::InstanceIndex, Some(Bi::PointSize) => crate::BuiltIn::PointSize, Some(Bi::VertexIndex) => crate::BuiltIn::VertexIndex, + Some(Bi::DrawIndex) => crate::BuiltIn::DrawID, // fragment Some(Bi::FragDepth) => crate::BuiltIn::FragDepth, Some(Bi::PointCoord) => crate::BuiltIn::PointCoord, diff --git a/naga/src/lib.rs b/naga/src/lib.rs index 038e215a6a..145b95f667 100644 --- a/naga/src/lib.rs +++ b/naga/src/lib.rs @@ -400,6 +400,7 @@ pub enum BuiltIn { InstanceIndex, PointSize, VertexIndex, + DrawID, // fragment FragDepth, PointCoord, diff --git a/naga/src/valid/interface.rs b/naga/src/valid/interface.rs index 150a1f9df5..ce9bc12a00 100644 --- a/naga/src/valid/interface.rs +++ b/naga/src/valid/interface.rs @@ -194,7 +194,11 @@ impl VaryingContext<'_> { } let (visible, type_good) = match built_in { - Bi::BaseInstance | Bi::BaseVertex | Bi::InstanceIndex | Bi::VertexIndex => ( + Bi::BaseInstance + | Bi::BaseVertex + | Bi::InstanceIndex + | Bi::VertexIndex + | Bi::DrawID => ( self.stage == St::Vertex && !self.output, *ty_inner == Ti::Scalar(crate::Scalar::U32), ),