@@ -8,7 +8,6 @@ use core::fmt;
88
99use arrayvec:: ArrayVec ;
1010use hashbrown:: hash_map:: Entry ;
11- use naga:: BuiltIn ;
1211use shader_io_deductions:: { display_deductions_as_optional_list, MaxVertexShaderOutputDeduction } ;
1312use thiserror:: Error ;
1413use wgt:: {
@@ -157,6 +156,117 @@ enum Varying {
157156 BuiltIn ( BuiltIn ) ,
158157}
159158
159+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
160+ enum BuiltIn {
161+ Position { invariant : bool } ,
162+ ViewIndex ,
163+ BaseInstance ,
164+ BaseVertex ,
165+ ClipDistances ,
166+ CullDistance ,
167+ InstanceIndex ,
168+ PointSize ,
169+ VertexIndex ,
170+ DrawIndex ,
171+ FragDepth ,
172+ PointCoord ,
173+ FrontFacing ,
174+ PrimitiveIndex ,
175+ Barycentric { perspective : bool } ,
176+ SampleIndex ,
177+ SampleMask ,
178+ GlobalInvocationId ,
179+ LocalInvocationId ,
180+ LocalInvocationIndex ,
181+ WorkGroupId ,
182+ WorkGroupSize ,
183+ NumWorkGroups ,
184+ NumSubgroups ,
185+ SubgroupId ,
186+ SubgroupSize ,
187+ SubgroupInvocationId ,
188+ MeshTaskSize ,
189+ CullPrimitive ,
190+ PointIndex ,
191+ LineIndices ,
192+ TriangleIndices ,
193+ VertexCount ,
194+ Vertices ,
195+ PrimitiveCount ,
196+ Primitives ,
197+ RayInvocationId ,
198+ NumRayInvocations ,
199+ InstanceCustomData ,
200+ GeometryIndex ,
201+ WorldRayOrigin ,
202+ WorldRayDirection ,
203+ ObjectRayOrigin ,
204+ ObjectRayDirection ,
205+ RayTmin ,
206+ RayTCurrentMax ,
207+ ObjectToWorld ,
208+ WorldToObject ,
209+ HitKind ,
210+ }
211+
212+ impl BuiltIn {
213+ pub fn to_naga ( & self ) -> naga:: BuiltIn {
214+ match self {
215+ & Self :: Position { invariant } => naga:: BuiltIn :: Position { invariant } ,
216+ Self :: ViewIndex => naga:: BuiltIn :: ViewIndex ,
217+ Self :: BaseInstance => naga:: BuiltIn :: BaseInstance ,
218+ Self :: BaseVertex => naga:: BuiltIn :: BaseVertex ,
219+ Self :: ClipDistances => naga:: BuiltIn :: ClipDistances ,
220+ Self :: CullDistance => naga:: BuiltIn :: CullDistance ,
221+ Self :: InstanceIndex => naga:: BuiltIn :: InstanceIndex ,
222+ Self :: PointSize => naga:: BuiltIn :: PointSize ,
223+ Self :: VertexIndex => naga:: BuiltIn :: VertexIndex ,
224+ Self :: DrawIndex => naga:: BuiltIn :: DrawIndex ,
225+ Self :: FragDepth => naga:: BuiltIn :: FragDepth ,
226+ Self :: PointCoord => naga:: BuiltIn :: PointCoord ,
227+ Self :: FrontFacing => naga:: BuiltIn :: FrontFacing ,
228+ Self :: PrimitiveIndex => naga:: BuiltIn :: PrimitiveIndex ,
229+ Self :: Barycentric { perspective } => naga:: BuiltIn :: Barycentric {
230+ perspective : * perspective,
231+ } ,
232+ Self :: SampleIndex => naga:: BuiltIn :: SampleIndex ,
233+ Self :: SampleMask => naga:: BuiltIn :: SampleMask ,
234+ Self :: GlobalInvocationId => naga:: BuiltIn :: GlobalInvocationId ,
235+ Self :: LocalInvocationId => naga:: BuiltIn :: LocalInvocationId ,
236+ Self :: LocalInvocationIndex => naga:: BuiltIn :: LocalInvocationIndex ,
237+ Self :: WorkGroupId => naga:: BuiltIn :: WorkGroupId ,
238+ Self :: WorkGroupSize => naga:: BuiltIn :: WorkGroupSize ,
239+ Self :: NumWorkGroups => naga:: BuiltIn :: NumWorkGroups ,
240+ Self :: NumSubgroups => naga:: BuiltIn :: NumSubgroups ,
241+ Self :: SubgroupId => naga:: BuiltIn :: SubgroupId ,
242+ Self :: SubgroupSize => naga:: BuiltIn :: SubgroupSize ,
243+ Self :: SubgroupInvocationId => naga:: BuiltIn :: SubgroupInvocationId ,
244+ Self :: MeshTaskSize => naga:: BuiltIn :: MeshTaskSize ,
245+ Self :: CullPrimitive => naga:: BuiltIn :: CullPrimitive ,
246+ Self :: PointIndex => naga:: BuiltIn :: PointIndex ,
247+ Self :: LineIndices => naga:: BuiltIn :: LineIndices ,
248+ Self :: TriangleIndices => naga:: BuiltIn :: TriangleIndices ,
249+ Self :: VertexCount => naga:: BuiltIn :: VertexCount ,
250+ Self :: Vertices => naga:: BuiltIn :: Vertices ,
251+ Self :: PrimitiveCount => naga:: BuiltIn :: PrimitiveCount ,
252+ Self :: Primitives => naga:: BuiltIn :: Primitives ,
253+ Self :: RayInvocationId => naga:: BuiltIn :: RayInvocationId ,
254+ Self :: NumRayInvocations => naga:: BuiltIn :: NumRayInvocations ,
255+ Self :: InstanceCustomData => naga:: BuiltIn :: InstanceCustomData ,
256+ Self :: GeometryIndex => naga:: BuiltIn :: GeometryIndex ,
257+ Self :: WorldRayOrigin => naga:: BuiltIn :: WorldRayOrigin ,
258+ Self :: WorldRayDirection => naga:: BuiltIn :: WorldRayDirection ,
259+ Self :: ObjectRayOrigin => naga:: BuiltIn :: ObjectRayOrigin ,
260+ Self :: ObjectRayDirection => naga:: BuiltIn :: ObjectRayDirection ,
261+ Self :: RayTmin => naga:: BuiltIn :: RayTmin ,
262+ Self :: RayTCurrentMax => naga:: BuiltIn :: RayTCurrentMax ,
263+ Self :: ObjectToWorld => naga:: BuiltIn :: ObjectToWorld ,
264+ Self :: WorldToObject => naga:: BuiltIn :: WorldToObject ,
265+ Self :: HitKind => naga:: BuiltIn :: HitKind ,
266+ }
267+ }
268+ }
269+
160270#[ allow( unused) ]
161271#[ derive( Debug ) ]
162272struct SpecializationConstant {
@@ -995,7 +1105,57 @@ impl Interface {
9951105 per_primitive,
9961106 } ,
9971107 } ,
998- Some ( & naga:: Binding :: BuiltIn ( built_in) ) => Varying :: BuiltIn ( built_in) ,
1108+ Some ( & naga:: Binding :: BuiltIn ( built_in) ) => Varying :: BuiltIn ( match built_in {
1109+ naga:: BuiltIn :: Position { invariant } => BuiltIn :: Position { invariant } ,
1110+ naga:: BuiltIn :: ViewIndex => BuiltIn :: ViewIndex ,
1111+ naga:: BuiltIn :: BaseInstance => BuiltIn :: BaseInstance ,
1112+ naga:: BuiltIn :: BaseVertex => BuiltIn :: BaseVertex ,
1113+ naga:: BuiltIn :: ClipDistances => BuiltIn :: ClipDistances ,
1114+ naga:: BuiltIn :: CullDistance => BuiltIn :: CullDistance ,
1115+ naga:: BuiltIn :: InstanceIndex => BuiltIn :: InstanceIndex ,
1116+ naga:: BuiltIn :: PointSize => BuiltIn :: PointSize ,
1117+ naga:: BuiltIn :: VertexIndex => BuiltIn :: VertexIndex ,
1118+ naga:: BuiltIn :: DrawIndex => BuiltIn :: DrawIndex ,
1119+ naga:: BuiltIn :: FragDepth => BuiltIn :: FragDepth ,
1120+ naga:: BuiltIn :: PointCoord => BuiltIn :: PointCoord ,
1121+ naga:: BuiltIn :: FrontFacing => BuiltIn :: FrontFacing ,
1122+ naga:: BuiltIn :: PrimitiveIndex => BuiltIn :: PrimitiveIndex ,
1123+ naga:: BuiltIn :: Barycentric { perspective } => BuiltIn :: Barycentric { perspective } ,
1124+ naga:: BuiltIn :: SampleIndex => BuiltIn :: SampleIndex ,
1125+ naga:: BuiltIn :: SampleMask => BuiltIn :: SampleMask ,
1126+ naga:: BuiltIn :: GlobalInvocationId => BuiltIn :: GlobalInvocationId ,
1127+ naga:: BuiltIn :: LocalInvocationId => BuiltIn :: LocalInvocationId ,
1128+ naga:: BuiltIn :: LocalInvocationIndex => BuiltIn :: LocalInvocationIndex ,
1129+ naga:: BuiltIn :: WorkGroupId => BuiltIn :: WorkGroupId ,
1130+ naga:: BuiltIn :: WorkGroupSize => BuiltIn :: WorkGroupSize ,
1131+ naga:: BuiltIn :: NumWorkGroups => BuiltIn :: NumWorkGroups ,
1132+ naga:: BuiltIn :: NumSubgroups => BuiltIn :: NumSubgroups ,
1133+ naga:: BuiltIn :: SubgroupId => BuiltIn :: SubgroupId ,
1134+ naga:: BuiltIn :: SubgroupSize => BuiltIn :: SubgroupSize ,
1135+ naga:: BuiltIn :: SubgroupInvocationId => BuiltIn :: SubgroupInvocationId ,
1136+ naga:: BuiltIn :: MeshTaskSize => BuiltIn :: MeshTaskSize ,
1137+ naga:: BuiltIn :: CullPrimitive => BuiltIn :: CullPrimitive ,
1138+ naga:: BuiltIn :: PointIndex => BuiltIn :: PointIndex ,
1139+ naga:: BuiltIn :: LineIndices => BuiltIn :: LineIndices ,
1140+ naga:: BuiltIn :: TriangleIndices => BuiltIn :: TriangleIndices ,
1141+ naga:: BuiltIn :: VertexCount => BuiltIn :: VertexCount ,
1142+ naga:: BuiltIn :: Vertices => BuiltIn :: Vertices ,
1143+ naga:: BuiltIn :: PrimitiveCount => BuiltIn :: PrimitiveCount ,
1144+ naga:: BuiltIn :: Primitives => BuiltIn :: Primitives ,
1145+ naga:: BuiltIn :: RayInvocationId => BuiltIn :: RayInvocationId ,
1146+ naga:: BuiltIn :: NumRayInvocations => BuiltIn :: NumRayInvocations ,
1147+ naga:: BuiltIn :: InstanceCustomData => BuiltIn :: InstanceCustomData ,
1148+ naga:: BuiltIn :: GeometryIndex => BuiltIn :: GeometryIndex ,
1149+ naga:: BuiltIn :: WorldRayOrigin => BuiltIn :: WorldRayOrigin ,
1150+ naga:: BuiltIn :: WorldRayDirection => BuiltIn :: WorldRayDirection ,
1151+ naga:: BuiltIn :: ObjectRayOrigin => BuiltIn :: ObjectRayOrigin ,
1152+ naga:: BuiltIn :: ObjectRayDirection => BuiltIn :: ObjectRayDirection ,
1153+ naga:: BuiltIn :: RayTmin => BuiltIn :: RayTmin ,
1154+ naga:: BuiltIn :: RayTCurrentMax => BuiltIn :: RayTCurrentMax ,
1155+ naga:: BuiltIn :: ObjectToWorld => BuiltIn :: ObjectToWorld ,
1156+ naga:: BuiltIn :: WorldToObject => BuiltIn :: WorldToObject ,
1157+ naga:: BuiltIn :: HitKind => BuiltIn :: HitKind ,
1158+ } ) ,
9991159 None => {
10001160 log:: error!( "Missing binding for a varying" ) ;
10011161 return ;
@@ -1510,17 +1670,16 @@ impl Interface {
15101670 let deductions = entry_point. inputs . iter ( ) . filter_map ( |output| match output {
15111671 Varying :: Local { .. } => None ,
15121672 Varying :: BuiltIn ( builtin) => {
1513- MaxFragmentShaderInputDeduction :: from_inter_stage_builtin ( * builtin) . or_else (
1514- || {
1673+ MaxFragmentShaderInputDeduction :: from_inter_stage_builtin ( builtin. to_naga ( ) )
1674+ . or_else ( || {
15151675 unreachable ! (
15161676 concat!(
15171677 "unexpected built-in provided; " ,
15181678 "{:?} is not used for fragment stage input" ,
15191679 ) ,
15201680 builtin
15211681 )
1522- } ,
1523- )
1682+ } )
15241683 }
15251684 } ) ;
15261685
0 commit comments