1 use crate::{compiler, ErrorCode};
2 use std::marker::PhantomData;
3 
4 /// A stage or compute kernel.
5 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
6 pub struct CombinedImageSampler {
7     pub combined_id: u32,
8     pub image_id: u32,
9     pub sampler_id: u32,
10 }
11 
12 /// A stage or compute kernel.
13 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
14 pub enum ExecutionModel {
15     Vertex,
16     TessellationControl,
17     TessellationEvaluation,
18     Geometry,
19     Fragment,
20     GlCompute,
21     Kernel,
22 }
23 
24 /// A decoration.
25 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
26 pub enum Decoration {
27     RelaxedPrecision,
28     SpecId,
29     Block,
30     BufferBlock,
31     RowMajor,
32     ColMajor,
33     ArrayStride,
34     MatrixStride,
35     GlslShared,
36     GlslPacked,
37     CPacked,
38     BuiltIn,
39     NoPerspective,
40     Flat,
41     Patch,
42     Centroid,
43     Sample,
44     Invariant,
45     Restrict,
46     Aliased,
47     Volatile,
48     Constant,
49     Coherent,
50     NonWritable,
51     NonReadable,
52     Uniform,
53     SaturatedConversion,
54     Stream,
55     Location,
56     Component,
57     Index,
58     Binding,
59     DescriptorSet,
60     Offset,
61     XfbBuffer,
62     XfbStride,
63     FuncParamAttr,
64     FpRoundingMode,
65     FpFastMathMode,
66     LinkageAttributes,
67     NoContraction,
68     InputAttachmentIndex,
69     Alignment,
70     OverrideCoverageNv,
71     PassthroughNv,
72     ViewportRelativeNv,
73     SecondaryViewportRelativeNv,
74 }
75 
76 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
77 pub enum VertexAttributeStep {
78     Vertex,
79     Instance,
80 }
81 
82 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
83 pub enum BuiltIn {
84     Position,
85     PointSize,
86     ClipDistance,
87     CullDistance,
88     VertexId,
89     InstanceId,
90     PrimitiveId,
91     InvocationId,
92     Layer,
93     ViewportIndex,
94     TessLevelOuter,
95     TessLevelInner,
96     TessCoord,
97     PatchVertices,
98     FragCoord,
99     PointCoord,
100     FrontFacing,
101     SampleId,
102     SamplePosition,
103     SampleMask,
104     FragDepth,
105     HelperInvocation,
106     NumWorkgroups,
107     WorkgroupSize,
108     WorkgroupId,
109     LocalInvocationId,
110     GlobalInvocationId,
111     LocalInvocationIndex,
112     WorkDim,
113     GlobalSize,
114     EnqueuedWorkgroupSize,
115     GlobalOffset,
116     GlobalLinearId,
117     SubgroupSize,
118     SubgroupMaxSize,
119     NumSubgroups,
120     NumEnqueuedSubgroups,
121     SubgroupId,
122     SubgroupLocalInvocationId,
123     VertexIndex,
124     InstanceIndex,
125     SubgroupEqMask,
126     SubgroupGeMask,
127     SubgroupGtMask,
128     SubgroupLeMask,
129     SubgroupLtMask,
130     BaseVertex,
131     BaseInstance,
132     DrawIndex,
133     DeviceIndex,
134     ViewIndex,
135     BaryCoordNoPerspAmd,
136     BaryCoordNoPerspCentroidAmd,
137     BaryCoordNoPerspSampleAmd,
138     BaryCoordSmoothAmd,
139     BaryCoordSmoothCentroidAmd,
140     BaryCoordSmoothSampleAmd,
141     BaryCoordPullModelAmd,
142     FragStencilRefExt,
143     ViewportMaskNv,
144     SecondaryPositionNv,
145     SecondaryViewportMaskNv,
146     PositionPerViewNv,
147     ViewportMaskPerViewNv,
148     FullyCoveredExt,
149     TaskCountNv,
150     PrimitiveCountNv,
151     PrimitiveIndicesNv,
152     ClipDistancePerViewNv,
153     CullDistancePerViewNv,
154     LayerPerViewNv,
155     MeshViewCountNv,
156     MeshViewIndicesNv,
157     BaryCoordNv,
158     BaryCoordNoPerspNv,
159     FragSizeExt,
160     FragInvocationCountExt,
161     LaunchIdNv,
162     LaunchSizeNv,
163     WorldRayOriginNv,
164     WorldRayDirectionNv,
165     ObjectRayOriginNv,
166     ObjectRayDirectionNv,
167     RayTminNv,
168     RayTmaxNv,
169     InstanceCustomIndexNv,
170     ObjectToWorldNv,
171     WorldToObjectNv,
172     HitTNv,
173     HitKindNv,
174     IncomingRayFlagsNv,
175 }
176 
177 #[cfg(feature = "msl")]
built_in_as_raw(built_in: Option<BuiltIn>) -> crate::bindings::spv::BuiltIn178 pub(crate) fn built_in_as_raw(built_in: Option<BuiltIn>) -> crate::bindings::spv::BuiltIn {
179     use crate::bindings as br;
180     use BuiltIn::*;
181     match built_in {
182         None => br::spv::BuiltIn::BuiltInMax,
183         Some(Position) => br::spv::BuiltIn::BuiltInPosition,
184         Some(PointSize) => br::spv::BuiltIn::BuiltInPointSize,
185         Some(ClipDistance) => br::spv::BuiltIn::BuiltInClipDistance,
186         Some(CullDistance) => br::spv::BuiltIn::BuiltInCullDistance,
187         Some(VertexId) => br::spv::BuiltIn::BuiltInVertexId,
188         Some(InstanceId) => br::spv::BuiltIn::BuiltInInstanceId,
189         Some(PrimitiveId) => br::spv::BuiltIn::BuiltInPrimitiveId,
190         Some(InvocationId) => br::spv::BuiltIn::BuiltInInvocationId,
191         Some(Layer) => br::spv::BuiltIn::BuiltInLayer,
192         Some(ViewportIndex) => br::spv::BuiltIn::BuiltInViewportIndex,
193         Some(TessLevelOuter) => br::spv::BuiltIn::BuiltInTessLevelOuter,
194         Some(TessLevelInner) => br::spv::BuiltIn::BuiltInTessLevelInner,
195         Some(TessCoord) => br::spv::BuiltIn::BuiltInTessCoord,
196         Some(PatchVertices) => br::spv::BuiltIn::BuiltInPatchVertices,
197         Some(FragCoord) => br::spv::BuiltIn::BuiltInFragCoord,
198         Some(PointCoord) => br::spv::BuiltIn::BuiltInPointCoord,
199         Some(FrontFacing) => br::spv::BuiltIn::BuiltInFrontFacing,
200         Some(SampleId) => br::spv::BuiltIn::BuiltInSampleId,
201         Some(SamplePosition) => br::spv::BuiltIn::BuiltInSamplePosition,
202         Some(SampleMask) => br::spv::BuiltIn::BuiltInSampleMask,
203         Some(FragDepth) => br::spv::BuiltIn::BuiltInFragDepth,
204         Some(HelperInvocation) => br::spv::BuiltIn::BuiltInHelperInvocation,
205         Some(NumWorkgroups) => br::spv::BuiltIn::BuiltInNumWorkgroups,
206         Some(WorkgroupSize) => br::spv::BuiltIn::BuiltInWorkgroupSize,
207         Some(WorkgroupId) => br::spv::BuiltIn::BuiltInWorkgroupId,
208         Some(LocalInvocationId) => br::spv::BuiltIn::BuiltInLocalInvocationId,
209         Some(GlobalInvocationId) => br::spv::BuiltIn::BuiltInGlobalInvocationId,
210         Some(LocalInvocationIndex) => br::spv::BuiltIn::BuiltInLocalInvocationIndex,
211         Some(WorkDim) => br::spv::BuiltIn::BuiltInWorkDim,
212         Some(GlobalSize) => br::spv::BuiltIn::BuiltInGlobalSize,
213         Some(EnqueuedWorkgroupSize) => br::spv::BuiltIn::BuiltInEnqueuedWorkgroupSize,
214         Some(GlobalOffset) => br::spv::BuiltIn::BuiltInGlobalOffset,
215         Some(GlobalLinearId) => br::spv::BuiltIn::BuiltInGlobalLinearId,
216         Some(SubgroupSize) => br::spv::BuiltIn::BuiltInSubgroupSize,
217         Some(SubgroupMaxSize) => br::spv::BuiltIn::BuiltInSubgroupMaxSize,
218         Some(NumSubgroups) => br::spv::BuiltIn::BuiltInNumSubgroups,
219         Some(NumEnqueuedSubgroups) => br::spv::BuiltIn::BuiltInNumEnqueuedSubgroups,
220         Some(SubgroupId) => br::spv::BuiltIn::BuiltInSubgroupId,
221         Some(SubgroupLocalInvocationId) => br::spv::BuiltIn::BuiltInSubgroupLocalInvocationId,
222         Some(VertexIndex) => br::spv::BuiltIn::BuiltInVertexIndex,
223         Some(InstanceIndex) => br::spv::BuiltIn::BuiltInInstanceIndex,
224         Some(SubgroupEqMask) => br::spv::BuiltIn::BuiltInSubgroupEqMask,
225         Some(SubgroupGeMask) => br::spv::BuiltIn::BuiltInSubgroupGeMask,
226         Some(SubgroupGtMask) => br::spv::BuiltIn::BuiltInSubgroupGtMask,
227         Some(SubgroupLeMask) => br::spv::BuiltIn::BuiltInSubgroupLeMask,
228         Some(SubgroupLtMask) => br::spv::BuiltIn::BuiltInSubgroupLtMask,
229         Some(BaseVertex) => br::spv::BuiltIn::BuiltInBaseVertex,
230         Some(BaseInstance) => br::spv::BuiltIn::BuiltInBaseInstance,
231         Some(DrawIndex) => br::spv::BuiltIn::BuiltInDrawIndex,
232         Some(DeviceIndex) => br::spv::BuiltIn::BuiltInDeviceIndex,
233         Some(ViewIndex) => br::spv::BuiltIn::BuiltInViewIndex,
234         Some(BaryCoordNoPerspAmd) => br::spv::BuiltIn::BuiltInBaryCoordNoPerspAMD,
235         Some(BaryCoordNoPerspCentroidAmd) => br::spv::BuiltIn::BuiltInBaryCoordNoPerspCentroidAMD,
236         Some(BaryCoordNoPerspSampleAmd) => br::spv::BuiltIn::BuiltInBaryCoordNoPerspSampleAMD,
237         Some(BaryCoordSmoothAmd) => br::spv::BuiltIn::BuiltInBaryCoordSmoothAMD,
238         Some(BaryCoordSmoothCentroidAmd) => br::spv::BuiltIn::BuiltInBaryCoordSmoothCentroidAMD,
239         Some(BaryCoordSmoothSampleAmd) => br::spv::BuiltIn::BuiltInBaryCoordSmoothSampleAMD,
240         Some(BaryCoordPullModelAmd) => br::spv::BuiltIn::BuiltInBaryCoordPullModelAMD,
241         Some(FragStencilRefExt) => br::spv::BuiltIn::BuiltInFragStencilRefEXT,
242         Some(ViewportMaskNv) => br::spv::BuiltIn::BuiltInViewportMaskNV,
243         Some(SecondaryPositionNv) => br::spv::BuiltIn::BuiltInSecondaryPositionNV,
244         Some(SecondaryViewportMaskNv) => br::spv::BuiltIn::BuiltInSecondaryViewportMaskNV,
245         Some(PositionPerViewNv) => br::spv::BuiltIn::BuiltInPositionPerViewNV,
246         Some(ViewportMaskPerViewNv) => br::spv::BuiltIn::BuiltInViewportMaskPerViewNV,
247         Some(FullyCoveredExt) => br::spv::BuiltIn::BuiltInFullyCoveredEXT,
248         Some(TaskCountNv) => br::spv::BuiltIn::BuiltInTaskCountNV,
249         Some(PrimitiveCountNv) => br::spv::BuiltIn::BuiltInPrimitiveCountNV,
250         Some(PrimitiveIndicesNv) => br::spv::BuiltIn::BuiltInPrimitiveIndicesNV,
251         Some(ClipDistancePerViewNv) => br::spv::BuiltIn::BuiltInClipDistancePerViewNV,
252         Some(CullDistancePerViewNv) => br::spv::BuiltIn::BuiltInCullDistancePerViewNV,
253         Some(LayerPerViewNv) => br::spv::BuiltIn::BuiltInLayerPerViewNV,
254         Some(MeshViewCountNv) => br::spv::BuiltIn::BuiltInMeshViewCountNV,
255         Some(MeshViewIndicesNv) => br::spv::BuiltIn::BuiltInMeshViewIndicesNV,
256         Some(BaryCoordNv) => br::spv::BuiltIn::BuiltInBaryCoordNV,
257         Some(BaryCoordNoPerspNv) => br::spv::BuiltIn::BuiltInBaryCoordNoPerspNV,
258         Some(FragSizeExt) => br::spv::BuiltIn::BuiltInFragSizeEXT,
259         Some(FragInvocationCountExt) => br::spv::BuiltIn::BuiltInFragInvocationCountEXT,
260         Some(LaunchIdNv) => br::spv::BuiltIn::BuiltInLaunchIdNV,
261         Some(LaunchSizeNv) => br::spv::BuiltIn::BuiltInLaunchSizeNV,
262         Some(WorldRayOriginNv) => br::spv::BuiltIn::BuiltInWorldRayOriginNV,
263         Some(WorldRayDirectionNv) => br::spv::BuiltIn::BuiltInWorldRayDirectionNV,
264         Some(ObjectRayOriginNv) => br::spv::BuiltIn::BuiltInObjectRayOriginNV,
265         Some(ObjectRayDirectionNv) => br::spv::BuiltIn::BuiltInObjectRayDirectionNV,
266         Some(RayTminNv) => br::spv::BuiltIn::BuiltInRayTminNV,
267         Some(RayTmaxNv) => br::spv::BuiltIn::BuiltInRayTmaxNV,
268         Some(InstanceCustomIndexNv) => br::spv::BuiltIn::BuiltInInstanceCustomIndexNV,
269         Some(ObjectToWorldNv) => br::spv::BuiltIn::BuiltInObjectToWorldNV,
270         Some(WorldToObjectNv) => br::spv::BuiltIn::BuiltInWorldToObjectNV,
271         Some(HitTNv) => br::spv::BuiltIn::BuiltInHitTNV,
272         Some(HitKindNv) => br::spv::BuiltIn::BuiltInHitKindNV,
273         Some(IncomingRayFlagsNv) => br::spv::BuiltIn::BuiltInIncomingRayFlagsNV,
274     }
275 }
276 
277 /// A work group size.
278 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
279 pub struct WorkGroupSize {
280     pub x: u32,
281     pub y: u32,
282     pub z: u32,
283 }
284 
285 /// An entry point for a SPIR-V module.
286 #[derive(Clone, Debug, Hash, Eq, PartialEq)]
287 pub struct EntryPoint {
288     pub name: String,
289     pub execution_model: ExecutionModel,
290     pub work_group_size: WorkGroupSize,
291 }
292 
293 /// Description of struct member's range.
294 #[derive(Clone, Debug, Hash, Eq, PartialEq)]
295 pub struct BufferRange {
296     /// An index. Useful for passing to `get_member_name` and `get_member_decoration`.
297     pub index: u32,
298     /// Bytes from start of buffer not beginning of struct.
299     pub offset: usize,
300     /// Size of field in bytes.
301     pub range: usize,
302 }
303 
304 /// A resource.
305 #[derive(Clone, Debug, Hash, Eq, PartialEq)]
306 pub struct Resource {
307     pub id: u32,
308     pub type_id: u32,
309     pub base_type_id: u32,
310     pub name: String,
311 }
312 
313 /// Specialization constant reference.
314 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
315 pub struct SpecializationConstant {
316     pub id: u32,
317     pub constant_id: u32,
318 }
319 
320 /// Work group size specialization constants.
321 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
322 pub struct WorkGroupSizeSpecializationConstants {
323     pub x: SpecializationConstant,
324     pub y: SpecializationConstant,
325     pub z: SpecializationConstant,
326 }
327 
328 /// Shader resources.
329 #[derive(Debug, Clone)]
330 pub struct ShaderResources {
331     pub uniform_buffers: Vec<Resource>,
332     pub storage_buffers: Vec<Resource>,
333     pub stage_inputs: Vec<Resource>,
334     pub stage_outputs: Vec<Resource>,
335     pub subpass_inputs: Vec<Resource>,
336     pub storage_images: Vec<Resource>,
337     pub sampled_images: Vec<Resource>,
338     pub atomic_counters: Vec<Resource>,
339     pub push_constant_buffers: Vec<Resource>,
340     pub separate_images: Vec<Resource>,
341     pub separate_samplers: Vec<Resource>,
342 }
343 
344 #[derive(Debug, Clone)]
345 #[non_exhaustive]
346 pub enum Type {
347     // TODO: Add missing fields to relevant variants from SPIRType
348     Unknown,
349     Void,
350     Boolean {
351         vecsize: u32,
352         columns: u32,
353         array: Vec<u32>,
354     },
355     Char {
356         array: Vec<u32>,
357     },
358     Int {
359         vecsize: u32,
360         columns: u32,
361         array: Vec<u32>,
362     },
363     UInt {
364         vecsize: u32,
365         columns: u32,
366         array: Vec<u32>,
367     },
368     Int64 {
369         vecsize: u32,
370         array: Vec<u32>,
371     },
372     UInt64 {
373         vecsize: u32,
374         array: Vec<u32>,
375     },
376     AtomicCounter {
377         array: Vec<u32>,
378     },
379     Half {
380         vecsize: u32,
381         columns: u32,
382         array: Vec<u32>,
383     },
384     Float {
385         vecsize: u32,
386         columns: u32,
387         array: Vec<u32>,
388     },
389     Double {
390         vecsize: u32,
391         columns: u32,
392         array: Vec<u32>,
393     },
394     Struct {
395         member_types: Vec<u32>,
396         array: Vec<u32>,
397     },
398     Image {
399         array: Vec<u32>,
400     },
401     SampledImage {
402         array: Vec<u32>,
403     },
404     Sampler {
405         array: Vec<u32>,
406     },
407     SByte {
408         vecsize: u32,
409         array: Vec<u32>,
410     },
411     UByte {
412         vecsize: u32,
413         array: Vec<u32>,
414     },
415     Short {
416         vecsize: u32,
417         array: Vec<u32>,
418     },
419     UShort {
420         vecsize: u32,
421         array: Vec<u32>,
422     },
423     ControlPointArray,
424     AccelerationStructure,
425     RayQuery,
426     Interpolant,
427 }
428 
429 /// A SPIR-V shader module.
430 #[derive(Debug, Clone)]
431 pub struct Module<'a> {
432     pub(crate) words: &'a [u32],
433 }
434 
435 impl<'a> Module<'a> {
436     /// Creates a shader module from SPIR-V words.
from_words(words: &[u32]) -> Module437     pub fn from_words(words: &[u32]) -> Module {
438         Module { words }
439     }
440 }
441 
442 pub trait Target {
443     type Data;
444 }
445 
446 /// An abstract syntax tree that corresponds to a SPIR-V module.
447 pub struct Ast<TTarget>
448 where
449     TTarget: Target,
450 {
451     pub(crate) compiler: compiler::Compiler<TTarget::Data>,
452     pub(crate) target_type: PhantomData<TTarget>,
453 }
454 
455 pub trait Parse<TTarget>: Sized {
parse(module: &Module) -> Result<Self, ErrorCode>456     fn parse(module: &Module) -> Result<Self, ErrorCode>;
457 }
458 
459 pub trait Compile<TTarget> {
460     type CompilerOptions;
461 
set_compiler_options( &mut self, compiler_options: &Self::CompilerOptions, ) -> Result<(), ErrorCode>462     fn set_compiler_options(
463         &mut self,
464         compiler_options: &Self::CompilerOptions,
465     ) -> Result<(), ErrorCode>;
compile(&mut self) -> Result<String, ErrorCode>466     fn compile(&mut self) -> Result<String, ErrorCode>;
467 }
468 
469 impl<TTarget> Ast<TTarget>
470 where
471     Self: Parse<TTarget> + Compile<TTarget>,
472     TTarget: Target,
473 {
474     /// Gets a decoration.
get_decoration(&self, id: u32, decoration: Decoration) -> Result<u32, ErrorCode>475     pub fn get_decoration(&self, id: u32, decoration: Decoration) -> Result<u32, ErrorCode> {
476         self.compiler.get_decoration(id, decoration)
477     }
478 
479     /// Gets a name. If not defined, an empty string will be returned.
get_name(&mut self, id: u32) -> Result<String, ErrorCode>480     pub fn get_name(&mut self, id: u32) -> Result<String, ErrorCode> {
481         self.compiler.get_name(id)
482     }
483 
484     /// Sets a name.
set_name(&mut self, id: u32, name: &str) -> Result<(), ErrorCode>485     pub fn set_name(&mut self, id: u32, name: &str) -> Result<(), ErrorCode> {
486         self.compiler.set_name(id, name)
487     }
488 
489     /// Unsets a decoration.
unset_decoration(&mut self, id: u32, decoration: Decoration) -> Result<(), ErrorCode>490     pub fn unset_decoration(&mut self, id: u32, decoration: Decoration) -> Result<(), ErrorCode> {
491         self.compiler.unset_decoration(id, decoration)
492     }
493 
494     /// Sets a decoration.
set_decoration( &mut self, id: u32, decoration: Decoration, argument: u32, ) -> Result<(), ErrorCode>495     pub fn set_decoration(
496         &mut self,
497         id: u32,
498         decoration: Decoration,
499         argument: u32,
500     ) -> Result<(), ErrorCode> {
501         self.compiler.set_decoration(id, decoration, argument)
502     }
503 
504     /// Gets entry points.
get_entry_points(&self) -> Result<Vec<EntryPoint>, ErrorCode>505     pub fn get_entry_points(&self) -> Result<Vec<EntryPoint>, ErrorCode> {
506         self.compiler.get_entry_points()
507     }
508 
509     /// Gets cleansed entry point names. `compile` must be called first.
get_cleansed_entry_point_name( &self, entry_point_name: &str, execution_model: ExecutionModel, ) -> Result<String, ErrorCode>510     pub fn get_cleansed_entry_point_name(
511         &self,
512         entry_point_name: &str,
513         execution_model: ExecutionModel,
514     ) -> Result<String, ErrorCode> {
515         if self.compiler.has_been_compiled {
516             self.compiler
517                 .get_cleansed_entry_point_name(entry_point_name, execution_model)
518         } else {
519             Err(ErrorCode::CompilationError(String::from(
520                 "`compile` must be called first",
521             )))
522         }
523     }
524 
525     /// Gets active buffer ragnes.  Useful for push constants.
get_active_buffer_ranges(&self, id: u32) -> Result<Vec<BufferRange>, ErrorCode>526     pub fn get_active_buffer_ranges(&self, id: u32) -> Result<Vec<BufferRange>, ErrorCode> {
527         self.compiler.get_active_buffer_ranges(id)
528     }
529 
530     /// Gets all specialization constants.
get_specialization_constants(&self) -> Result<Vec<SpecializationConstant>, ErrorCode>531     pub fn get_specialization_constants(&self) -> Result<Vec<SpecializationConstant>, ErrorCode> {
532         self.compiler.get_specialization_constants()
533     }
534 
535     /// Set reference of a scalar constant to a value, overriding the default.
536     ///
537     /// Can be used to override specialization constants.
set_scalar_constant(&mut self, id: u32, value: u64) -> Result<(), ErrorCode>538     pub fn set_scalar_constant(&mut self, id: u32, value: u64) -> Result<(), ErrorCode> {
539         self.compiler.set_scalar_constant(id, value)
540     }
541 
542     /// Gets shader resources.
get_shader_resources(&self) -> Result<ShaderResources, ErrorCode>543     pub fn get_shader_resources(&self) -> Result<ShaderResources, ErrorCode> {
544         self.compiler.get_shader_resources()
545     }
546 
547     /// Gets the SPIR-V type associated with an ID.
get_type(&self, id: u32) -> Result<Type, ErrorCode>548     pub fn get_type(&self, id: u32) -> Result<Type, ErrorCode> {
549         self.compiler.get_type(id)
550     }
551 
552     /// Gets the identifier for a member located at `index` within an `OpTypeStruct`.
get_member_name(&self, id: u32, index: u32) -> Result<String, ErrorCode>553     pub fn get_member_name(&self, id: u32, index: u32) -> Result<String, ErrorCode> {
554         self.compiler.get_member_name(id, index)
555     }
556 
557     /// Gets a decoration for a member located at `index` within an `OpTypeStruct`.
get_member_decoration( &self, id: u32, index: u32, decoration: Decoration, ) -> Result<u32, ErrorCode>558     pub fn get_member_decoration(
559         &self,
560         id: u32,
561         index: u32,
562         decoration: Decoration,
563     ) -> Result<u32, ErrorCode> {
564         self.compiler.get_member_decoration(id, index, decoration)
565     }
566 
567     /// Sets a decoration for a member located at `index` within an `OpTypeStruct`.
set_member_decoration( &mut self, id: u32, index: u32, decoration: Decoration, argument: u32, ) -> Result<(), ErrorCode>568     pub fn set_member_decoration(
569         &mut self,
570         id: u32,
571         index: u32,
572         decoration: Decoration,
573         argument: u32,
574     ) -> Result<(), ErrorCode> {
575         self.compiler
576             .set_member_decoration(id, index, decoration, argument)
577     }
578 
579     /// Gets the effective size of a buffer block.
get_declared_struct_size(&self, id: u32) -> Result<u32, ErrorCode>580     pub fn get_declared_struct_size(&self, id: u32) -> Result<u32, ErrorCode> {
581         self.compiler.get_declared_struct_size(id)
582     }
583 
584     /// Gets the effective size of a buffer block struct member.
get_declared_struct_member_size(&self, id: u32, index: u32) -> Result<u32, ErrorCode>585     pub fn get_declared_struct_member_size(&self, id: u32, index: u32) -> Result<u32, ErrorCode> {
586         self.compiler.get_declared_struct_member_size(id, index)
587     }
588 
589     /// Renames an interface variable.
rename_interface_variable( &mut self, resources: &[Resource], location: u32, name: &str, ) -> Result<(), ErrorCode>590     pub fn rename_interface_variable(
591         &mut self,
592         resources: &[Resource],
593         location: u32,
594         name: &str,
595     ) -> Result<(), ErrorCode> {
596         self.compiler
597             .rename_interface_variable(resources, location, name)
598     }
599 
600     /// Gets work group size specialization constants.
get_work_group_size_specialization_constants( &self, ) -> Result<WorkGroupSizeSpecializationConstants, ErrorCode>601     pub fn get_work_group_size_specialization_constants(
602         &self,
603     ) -> Result<WorkGroupSizeSpecializationConstants, ErrorCode> {
604         self.compiler.get_work_group_size_specialization_constants()
605     }
606 
607     /// Parses a module into `Ast`.
parse(module: &Module) -> Result<Self, ErrorCode>608     pub fn parse(module: &Module) -> Result<Self, ErrorCode> {
609         Parse::<TTarget>::parse(&module)
610     }
611 
612     /// Sets compile options.
set_compiler_options( &mut self, options: &<Self as Compile<TTarget>>::CompilerOptions, ) -> Result<(), ErrorCode>613     pub fn set_compiler_options(
614         &mut self,
615         options: &<Self as Compile<TTarget>>::CompilerOptions,
616     ) -> Result<(), ErrorCode> {
617         Compile::<TTarget>::set_compiler_options(self, options)
618     }
619 
620     /// Compiles an abstract syntax tree to a `String` in the specified `TTarget` language.
compile(&mut self) -> Result<String, ErrorCode>621     pub fn compile(&mut self) -> Result<String, ErrorCode> {
622         self.compiler.has_been_compiled = true;
623         Compile::<TTarget>::compile(self)
624     }
625 }
626