Skip to content

Commit 02bf10b

Browse files
committed
Implement shader barycentrics
1 parent adf4b2f commit 02bf10b

File tree

22 files changed

+280
-0
lines changed

22 files changed

+280
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ SamplerDescriptor {
7373
}
7474
```
7575

76+
### Added/New Features
77+
78+
## General
79+
80+
- Implement shader triangle barycentric coordinate builtins. By @atlv24 in [#8320](https://github.com/gfx-rs/wgpu/pull/8320).
81+
7682
### Bug Fixes
7783

7884
#### General

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,11 @@ impl Options {
530530
crate::BuiltIn::PrimitiveIndex if self.lang_version < (2, 2) => {
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/naga/issues/2164)
535+
crate::BuiltIn::Barycentric if self.lang_version < (2, 2) => {
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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,13 @@ impl Writer {
20892089
)?;
20902090
BuiltIn::PrimitiveId
20912091
}
2092+
Bi::Barycentric => {
2093+
self.require_any(
2094+
"`barycentric` built-in",
2095+
&[spirv::Capability::FragmentBarycentricKHR],
2096+
)?;
2097+
BuiltIn::BaryCoordKHR
2098+
}
20922099
Bi::SampleIndex => {
20932100
self.require_any(
20942101
"`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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6038,6 +6038,10 @@ impl<I: Iterator<Item = u32>> Frontend<I> {
60386038
size: crate::VectorSize::Tri,
60396039
scalar: crate::Scalar::U32,
60406040
}),
6041+
crate::BuiltIn::Barycentric => Some(crate::TypeInner::Vector {
6042+
size: crate::VectorSize::Tri,
6043+
scalar: crate::Scalar::F32,
6044+
}),
60416045
_ => None,
60426046
};
60436047
if let (Some(inner), Some(crate::ScalarKind::Sint)) =

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ pub fn map_built_in(
3636
"front_facing" => crate::BuiltIn::FrontFacing,
3737
"frag_depth" => crate::BuiltIn::FragDepth,
3838
"primitive_index" => crate::BuiltIn::PrimitiveIndex,
39+
"barycentric" => crate::BuiltIn::Barycentric,
3940
"sample_index" => crate::BuiltIn::SampleIndex,
4041
"sample_mask" => crate::BuiltIn::SampleMask,
4142
// compute

0 commit comments

Comments
 (0)