spv_cross/
spirv.rs

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