@@ -7,7 +7,6 @@ use core::fmt;
77
88use arrayvec:: ArrayVec ;
99use hashbrown:: hash_map:: Entry ;
10- use naga:: BuiltIn ;
1110use shader_io_deductions:: { display_deductions_as_optional_list, MaxVertexShaderOutputDeduction } ;
1211use thiserror:: Error ;
1312use wgt:: {
@@ -156,6 +155,117 @@ enum Varying {
156155 BuiltIn ( BuiltIn ) ,
157156}
158157
158+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
159+ enum BuiltIn {
160+ Position { invariant : bool } ,
161+ ViewIndex ,
162+ BaseInstance ,
163+ BaseVertex ,
164+ ClipDistance ,
165+ CullDistance ,
166+ InstanceIndex ,
167+ PointSize ,
168+ VertexIndex ,
169+ DrawID ,
170+ FragDepth ,
171+ PointCoord ,
172+ FrontFacing ,
173+ PrimitiveIndex ,
174+ Barycentric { perspective : bool } ,
175+ SampleIndex ,
176+ SampleMask ,
177+ GlobalInvocationId ,
178+ LocalInvocationId ,
179+ LocalInvocationIndex ,
180+ WorkGroupId ,
181+ WorkGroupSize ,
182+ NumWorkGroups ,
183+ NumSubgroups ,
184+ SubgroupId ,
185+ SubgroupSize ,
186+ SubgroupInvocationId ,
187+ MeshTaskSize ,
188+ CullPrimitive ,
189+ PointIndex ,
190+ LineIndices ,
191+ TriangleIndices ,
192+ VertexCount ,
193+ Vertices ,
194+ PrimitiveCount ,
195+ Primitives ,
196+ RayInvocationId ,
197+ NumRayInvocations ,
198+ InstanceCustomData ,
199+ GeometryIndex ,
200+ WorldRayOrigin ,
201+ WorldRayDirection ,
202+ ObjectRayOrigin ,
203+ ObjectRayDirection ,
204+ RayTmin ,
205+ RayTCurrentMax ,
206+ ObjectToWorld ,
207+ WorldToObject ,
208+ HitKind ,
209+ }
210+
211+ impl BuiltIn {
212+ pub fn to_naga ( & self ) -> naga:: BuiltIn {
213+ match self {
214+ & Self :: Position { invariant } => naga:: BuiltIn :: Position { invariant } ,
215+ Self :: ViewIndex => naga:: BuiltIn :: ViewIndex ,
216+ Self :: BaseInstance => naga:: BuiltIn :: BaseInstance ,
217+ Self :: BaseVertex => naga:: BuiltIn :: BaseVertex ,
218+ Self :: ClipDistance => naga:: BuiltIn :: ClipDistance ,
219+ Self :: CullDistance => naga:: BuiltIn :: CullDistance ,
220+ Self :: InstanceIndex => naga:: BuiltIn :: InstanceIndex ,
221+ Self :: PointSize => naga:: BuiltIn :: PointSize ,
222+ Self :: VertexIndex => naga:: BuiltIn :: VertexIndex ,
223+ Self :: DrawID => naga:: BuiltIn :: DrawID ,
224+ Self :: FragDepth => naga:: BuiltIn :: FragDepth ,
225+ Self :: PointCoord => naga:: BuiltIn :: PointCoord ,
226+ Self :: FrontFacing => naga:: BuiltIn :: FrontFacing ,
227+ Self :: PrimitiveIndex => naga:: BuiltIn :: PrimitiveIndex ,
228+ Self :: Barycentric { perspective } => naga:: BuiltIn :: Barycentric {
229+ perspective : * perspective,
230+ } ,
231+ Self :: SampleIndex => naga:: BuiltIn :: SampleIndex ,
232+ Self :: SampleMask => naga:: BuiltIn :: SampleMask ,
233+ Self :: GlobalInvocationId => naga:: BuiltIn :: GlobalInvocationId ,
234+ Self :: LocalInvocationId => naga:: BuiltIn :: LocalInvocationId ,
235+ Self :: LocalInvocationIndex => naga:: BuiltIn :: LocalInvocationIndex ,
236+ Self :: WorkGroupId => naga:: BuiltIn :: WorkGroupId ,
237+ Self :: WorkGroupSize => naga:: BuiltIn :: WorkGroupSize ,
238+ Self :: NumWorkGroups => naga:: BuiltIn :: NumWorkGroups ,
239+ Self :: NumSubgroups => naga:: BuiltIn :: NumSubgroups ,
240+ Self :: SubgroupId => naga:: BuiltIn :: SubgroupId ,
241+ Self :: SubgroupSize => naga:: BuiltIn :: SubgroupSize ,
242+ Self :: SubgroupInvocationId => naga:: BuiltIn :: SubgroupInvocationId ,
243+ Self :: MeshTaskSize => naga:: BuiltIn :: MeshTaskSize ,
244+ Self :: CullPrimitive => naga:: BuiltIn :: CullPrimitive ,
245+ Self :: PointIndex => naga:: BuiltIn :: PointIndex ,
246+ Self :: LineIndices => naga:: BuiltIn :: LineIndices ,
247+ Self :: TriangleIndices => naga:: BuiltIn :: TriangleIndices ,
248+ Self :: VertexCount => naga:: BuiltIn :: VertexCount ,
249+ Self :: Vertices => naga:: BuiltIn :: Vertices ,
250+ Self :: PrimitiveCount => naga:: BuiltIn :: PrimitiveCount ,
251+ Self :: Primitives => naga:: BuiltIn :: Primitives ,
252+ Self :: RayInvocationId => naga:: BuiltIn :: RayInvocationId ,
253+ Self :: NumRayInvocations => naga:: BuiltIn :: NumRayInvocations ,
254+ Self :: InstanceCustomData => naga:: BuiltIn :: InstanceCustomData ,
255+ Self :: GeometryIndex => naga:: BuiltIn :: GeometryIndex ,
256+ Self :: WorldRayOrigin => naga:: BuiltIn :: WorldRayOrigin ,
257+ Self :: WorldRayDirection => naga:: BuiltIn :: WorldRayDirection ,
258+ Self :: ObjectRayOrigin => naga:: BuiltIn :: ObjectRayOrigin ,
259+ Self :: ObjectRayDirection => naga:: BuiltIn :: ObjectRayDirection ,
260+ Self :: RayTmin => naga:: BuiltIn :: RayTmin ,
261+ Self :: RayTCurrentMax => naga:: BuiltIn :: RayTCurrentMax ,
262+ Self :: ObjectToWorld => naga:: BuiltIn :: ObjectToWorld ,
263+ Self :: WorldToObject => naga:: BuiltIn :: WorldToObject ,
264+ Self :: HitKind => naga:: BuiltIn :: HitKind ,
265+ }
266+ }
267+ }
268+
159269#[ allow( unused) ]
160270#[ derive( Debug ) ]
161271struct SpecializationConstant {
@@ -1102,7 +1212,57 @@ impl Interface {
11021212 per_primitive,
11031213 } ,
11041214 } ,
1105- Some ( & naga:: Binding :: BuiltIn ( built_in) ) => Varying :: BuiltIn ( built_in) ,
1215+ Some ( & naga:: Binding :: BuiltIn ( built_in) ) => Varying :: BuiltIn ( match built_in {
1216+ naga:: BuiltIn :: Position { invariant } => BuiltIn :: Position { invariant } ,
1217+ naga:: BuiltIn :: ViewIndex => BuiltIn :: ViewIndex ,
1218+ naga:: BuiltIn :: BaseInstance => BuiltIn :: BaseInstance ,
1219+ naga:: BuiltIn :: BaseVertex => BuiltIn :: BaseVertex ,
1220+ naga:: BuiltIn :: ClipDistance => BuiltIn :: ClipDistance ,
1221+ naga:: BuiltIn :: CullDistance => BuiltIn :: CullDistance ,
1222+ naga:: BuiltIn :: InstanceIndex => BuiltIn :: InstanceIndex ,
1223+ naga:: BuiltIn :: PointSize => BuiltIn :: PointSize ,
1224+ naga:: BuiltIn :: VertexIndex => BuiltIn :: VertexIndex ,
1225+ naga:: BuiltIn :: DrawID => BuiltIn :: DrawID ,
1226+ naga:: BuiltIn :: FragDepth => BuiltIn :: FragDepth ,
1227+ naga:: BuiltIn :: PointCoord => BuiltIn :: PointCoord ,
1228+ naga:: BuiltIn :: FrontFacing => BuiltIn :: FrontFacing ,
1229+ naga:: BuiltIn :: PrimitiveIndex => BuiltIn :: PrimitiveIndex ,
1230+ naga:: BuiltIn :: Barycentric { perspective } => BuiltIn :: Barycentric { perspective } ,
1231+ naga:: BuiltIn :: SampleIndex => BuiltIn :: SampleIndex ,
1232+ naga:: BuiltIn :: SampleMask => BuiltIn :: SampleMask ,
1233+ naga:: BuiltIn :: GlobalInvocationId => BuiltIn :: GlobalInvocationId ,
1234+ naga:: BuiltIn :: LocalInvocationId => BuiltIn :: LocalInvocationId ,
1235+ naga:: BuiltIn :: LocalInvocationIndex => BuiltIn :: LocalInvocationIndex ,
1236+ naga:: BuiltIn :: WorkGroupId => BuiltIn :: WorkGroupId ,
1237+ naga:: BuiltIn :: WorkGroupSize => BuiltIn :: WorkGroupSize ,
1238+ naga:: BuiltIn :: NumWorkGroups => BuiltIn :: NumWorkGroups ,
1239+ naga:: BuiltIn :: NumSubgroups => BuiltIn :: NumSubgroups ,
1240+ naga:: BuiltIn :: SubgroupId => BuiltIn :: SubgroupId ,
1241+ naga:: BuiltIn :: SubgroupSize => BuiltIn :: SubgroupSize ,
1242+ naga:: BuiltIn :: SubgroupInvocationId => BuiltIn :: SubgroupInvocationId ,
1243+ naga:: BuiltIn :: MeshTaskSize => BuiltIn :: MeshTaskSize ,
1244+ naga:: BuiltIn :: CullPrimitive => BuiltIn :: CullPrimitive ,
1245+ naga:: BuiltIn :: PointIndex => BuiltIn :: PointIndex ,
1246+ naga:: BuiltIn :: LineIndices => BuiltIn :: LineIndices ,
1247+ naga:: BuiltIn :: TriangleIndices => BuiltIn :: TriangleIndices ,
1248+ naga:: BuiltIn :: VertexCount => BuiltIn :: VertexCount ,
1249+ naga:: BuiltIn :: Vertices => BuiltIn :: Vertices ,
1250+ naga:: BuiltIn :: PrimitiveCount => BuiltIn :: PrimitiveCount ,
1251+ naga:: BuiltIn :: Primitives => BuiltIn :: Primitives ,
1252+ naga:: BuiltIn :: RayInvocationId => BuiltIn :: RayInvocationId ,
1253+ naga:: BuiltIn :: NumRayInvocations => BuiltIn :: NumRayInvocations ,
1254+ naga:: BuiltIn :: InstanceCustomData => BuiltIn :: InstanceCustomData ,
1255+ naga:: BuiltIn :: GeometryIndex => BuiltIn :: GeometryIndex ,
1256+ naga:: BuiltIn :: WorldRayOrigin => BuiltIn :: WorldRayOrigin ,
1257+ naga:: BuiltIn :: WorldRayDirection => BuiltIn :: WorldRayDirection ,
1258+ naga:: BuiltIn :: ObjectRayOrigin => BuiltIn :: ObjectRayOrigin ,
1259+ naga:: BuiltIn :: ObjectRayDirection => BuiltIn :: ObjectRayDirection ,
1260+ naga:: BuiltIn :: RayTmin => BuiltIn :: RayTmin ,
1261+ naga:: BuiltIn :: RayTCurrentMax => BuiltIn :: RayTCurrentMax ,
1262+ naga:: BuiltIn :: ObjectToWorld => BuiltIn :: ObjectToWorld ,
1263+ naga:: BuiltIn :: WorldToObject => BuiltIn :: WorldToObject ,
1264+ naga:: BuiltIn :: HitKind => BuiltIn :: HitKind ,
1265+ } ) ,
11061266 None => {
11071267 log:: error!( "Missing binding for a varying" ) ;
11081268 return ;
@@ -1608,17 +1768,16 @@ impl Interface {
16081768 let deductions = entry_point. inputs . iter ( ) . filter_map ( |output| match output {
16091769 Varying :: Local { .. } => None ,
16101770 Varying :: BuiltIn ( builtin) => {
1611- MaxFragmentShaderInputDeduction :: from_inter_stage_builtin ( * builtin) . or_else (
1612- || {
1771+ MaxFragmentShaderInputDeduction :: from_inter_stage_builtin ( builtin. to_naga ( ) )
1772+ . or_else ( || {
16131773 unreachable ! (
16141774 concat!(
16151775 "unexpected built-in provided; " ,
16161776 "{:?} is not used for fragment stage input" ,
16171777 ) ,
16181778 builtin
16191779 )
1620- } ,
1621- )
1780+ } )
16221781 }
16231782 } ) ;
16241783
0 commit comments