Skip to content

Commit ddcd89f

Browse files
authored
Implement shader barycentrics (#8320)
1 parent 54beef8 commit ddcd89f

File tree

34 files changed

+422
-4
lines changed

34 files changed

+422
-4
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ SamplerDescriptor {
8585
- Using both the wgpu command encoding APIs and `CommandEncoder::as_hal_mut` on the same encoder will now result in a panic.
8686
- Allow `include_spirv!` and `include_spirv_raw!` macros to be used in constants and statics. By @clarfonthey in [#8250](https://github.com/gfx-rs/wgpu/pull/8250).
8787

88+
### Added/New Features
89+
90+
## General
91+
92+
- Implement shader triangle barycentric coordinate builtins. By @atlv24 in [#8320](https://github.com/gfx-rs/wgpu/pull/8320).
93+
8894
### Bug Fixes
8995

9096
#### naga

naga/src/back/glsl/features.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ bitflags::bitflags! {
5555
const SUBGROUP_OPERATIONS = 1 << 24;
5656
/// Image atomics
5757
const TEXTURE_ATOMICS = 1 << 25;
58+
/// Image atomics
59+
const SHADER_BARYCENTRICS = 1 << 26;
5860
}
5961
}
6062

@@ -288,6 +290,14 @@ impl FeaturesManager {
288290
writeln!(out, "#extension GL_OES_shader_image_atomic : require")?;
289291
}
290292

293+
if self.0.contains(Features::SHADER_BARYCENTRICS) {
294+
// https://github.com/KhronosGroup/GLSL/blob/main/extensions/ext/GLSL_EXT_fragment_shader_barycentric.txt
295+
writeln!(
296+
out,
297+
"#extension GL_EXT_fragment_shader_barycentric : require"
298+
)?;
299+
}
300+
291301
Ok(())
292302
}
293303
}
@@ -603,6 +613,9 @@ impl<W> Writer<'_, W> {
603613
crate::BuiltIn::InstanceIndex | crate::BuiltIn::DrawID => {
604614
self.features.request(Features::INSTANCE_INDEX)
605615
}
616+
crate::BuiltIn::Barycentric => {
617+
self.features.request(Features::SHADER_BARYCENTRICS)
618+
}
606619
_ => {}
607620
},
608621
Binding::Location {

naga/src/back/glsl/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5227,6 +5227,7 @@ const fn glsl_built_in(built_in: crate::BuiltIn, options: VaryingOptions) -> &'s
52275227
Bi::PointCoord => "gl_PointCoord",
52285228
Bi::FrontFacing => "gl_FrontFacing",
52295229
Bi::PrimitiveIndex => "uint(gl_PrimitiveID)",
5230+
Bi::Barycentric => "gl_BaryCoordEXT",
52305231
Bi::SampleIndex => "gl_SampleID",
52315232
Bi::SampleMask => {
52325233
if options.output {

naga/src/back/hlsl/conv.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ impl crate::BuiltIn {
161161
Self::FragDepth => "SV_Depth",
162162
Self::FrontFacing => "SV_IsFrontFace",
163163
Self::PrimitiveIndex => "SV_PrimitiveID",
164+
Self::Barycentric => "SV_Barycentrics",
164165
Self::SampleIndex => "SV_SampleIndex",
165166
Self::SampleMask => "SV_Coverage",
166167
// compute

naga/src/back/msl/mod.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,10 +526,15 @@ impl Options {
526526
return Err(Error::UnsupportedAttribute("instance_id".to_string()));
527527
}
528528
// macOS: Since Metal 2.2
529-
// iOS: Since Metal 2.3 (check depends on https://github.com/gfx-rs/naga/issues/2164)
530-
crate::BuiltIn::PrimitiveIndex if self.lang_version < (2, 2) => {
529+
// iOS: Since Metal 2.3 (check depends on https://github.com/gfx-rs/wgpu/issues/4414)
530+
crate::BuiltIn::PrimitiveIndex if self.lang_version < (2, 3) => {
531531
return Err(Error::UnsupportedAttribute("primitive_id".to_string()));
532532
}
533+
// macOS: Since Metal 2.2
534+
// iOS: Since Metal 2.3 (check depends on https://github.com/gfx-rs/wgpu/issues/4414)
535+
crate::BuiltIn::Barycentric if self.lang_version < (2, 3) => {
536+
return Err(Error::UnsupportedAttribute("barycentric_coord".to_string()));
537+
}
533538
_ => {}
534539
}
535540

@@ -680,6 +685,7 @@ impl ResolvedBinding {
680685
Bi::PointCoord => "point_coord",
681686
Bi::FrontFacing => "front_facing",
682687
Bi::PrimitiveIndex => "primitive_id",
688+
Bi::Barycentric => "barycentric_coord",
683689
Bi::SampleIndex => "sample_id",
684690
Bi::SampleMask => "sample_mask",
685691
// compute

naga/src/back/spv/writer.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,14 @@ impl Writer {
20892089
)?;
20902090
BuiltIn::PrimitiveId
20912091
}
2092+
Bi::Barycentric => {
2093+
self.require_any(
2094+
"`barycentric` built-in",
2095+
&[spirv::Capability::FragmentBarycentricKHR],
2096+
)?;
2097+
self.use_extension("SPV_KHR_fragment_shader_barycentric");
2098+
BuiltIn::BaryCoordKHR
2099+
}
20922100
Bi::SampleIndex => {
20932101
self.require_any(
20942102
"`sample_index` built-in",

naga/src/common/wgsl/to_wgsl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ impl TryToWgsl for crate::BuiltIn {
169169
Bi::FragDepth => "frag_depth",
170170
Bi::FrontFacing => "front_facing",
171171
Bi::PrimitiveIndex => "primitive_index",
172+
Bi::Barycentric => "barycentric",
172173
Bi::SampleIndex => "sample_index",
173174
Bi::SampleMask => "sample_mask",
174175
Bi::GlobalInvocationId => "global_invocation_id",

naga/src/front/glsl/variables.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ impl Frontend {
200200
"gl_BaseVertex" => BuiltIn::BaseVertex,
201201
"gl_BaseInstance" => BuiltIn::BaseInstance,
202202
"gl_PrimitiveID" => BuiltIn::PrimitiveIndex,
203+
"gl_BaryCoordEXT" => BuiltIn::Barycentric,
203204
"gl_InstanceIndex" => BuiltIn::InstanceIndex,
204205
"gl_VertexIndex" => BuiltIn::VertexIndex,
205206
"gl_SampleID" => BuiltIn::SampleIndex,

naga/src/front/spv/convert.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ pub(super) fn map_builtin(word: spirv::Word, invariant: bool) -> Result<crate::B
147147
Some(Bi::PointCoord) => crate::BuiltIn::PointCoord,
148148
Some(Bi::FrontFacing) => crate::BuiltIn::FrontFacing,
149149
Some(Bi::PrimitiveId) => crate::BuiltIn::PrimitiveIndex,
150+
Some(Bi::BaryCoordKHR) => crate::BuiltIn::Barycentric,
150151
Some(Bi::SampleId) => crate::BuiltIn::SampleIndex,
151152
Some(Bi::SampleMask) => crate::BuiltIn::SampleMask,
152153
// compute

naga/src/front/spv/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub const SUPPORTED_CAPABILITIES: &[spirv::Capability] = &[
8383
spirv::Capability::GroupNonUniformShuffleRelative,
8484
spirv::Capability::RuntimeDescriptorArray,
8585
spirv::Capability::StorageImageMultisample,
86+
spirv::Capability::FragmentBarycentricKHR,
8687
// tricky ones
8788
spirv::Capability::UniformBufferArrayDynamicIndexing,
8889
spirv::Capability::StorageBufferArrayDynamicIndexing,
@@ -6038,6 +6039,10 @@ impl<I: Iterator<Item = u32>> Frontend<I> {
60386039
size: crate::VectorSize::Tri,
60396040
scalar: crate::Scalar::U32,
60406041
}),
6042+
crate::BuiltIn::Barycentric => Some(crate::TypeInner::Vector {
6043+
size: crate::VectorSize::Tri,
6044+
scalar: crate::Scalar::F32,
6045+
}),
60416046
_ => None,
60426047
};
60436048
if let (Some(inner), Some(crate::ScalarKind::Sint)) =

0 commit comments

Comments
 (0)