1use std::collections::HashSet;
2use crate::{compiler, ErrorCode};
3use std::marker::PhantomData;
4
5#[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#[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#[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#[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#[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#[derive(Clone, Debug, Hash, Eq, PartialEq)]
302pub struct BufferRange {
303 pub index: u32,
305 pub offset: usize,
307 pub range: usize,
309}
310
311#[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#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
322pub struct SpecializationConstant {
323 pub id: u32,
324 pub constant_id: u32,
325}
326
327#[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#[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 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#[derive(Debug, Clone)]
527pub struct Module<'a> {
528 pub(crate) words: &'a [u32],
529}
530
531impl<'a> Module<'a> {
532 pub fn from_words(words: &[u32]) -> Module {
534 Module { words }
535 }
536}
537
538pub trait Target {
539 type Data;
540}
541
542pub 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 pub fn get_decoration(&self, id: u32, decoration: Decoration) -> Result<u32, ErrorCode> {
572 self.compiler.get_decoration(id, decoration)
573 }
574
575 pub fn get_name(&mut self, id: u32) -> Result<String, ErrorCode> {
577 self.compiler.get_name(id)
578 }
579
580 pub fn set_name(&mut self, id: u32, name: &str) -> Result<(), ErrorCode> {
582 self.compiler.set_name(id, name)
583 }
584
585 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 pub fn unset_decoration(&mut self, id: u32, decoration: Decoration) -> Result<(), ErrorCode> {
592 self.compiler.unset_decoration(id, decoration)
593 }
594
595 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 pub fn get_entry_points(&self) -> Result<Vec<EntryPoint>, ErrorCode> {
607 self.compiler.get_entry_points()
608 }
609
610 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 pub fn get_active_buffer_ranges(&self, id: u32) -> Result<Vec<BufferRange>, ErrorCode> {
628 self.compiler.get_active_buffer_ranges(id)
629 }
630
631 pub fn get_specialization_constants(&self) -> Result<Vec<SpecializationConstant>, ErrorCode> {
633 self.compiler.get_specialization_constants()
634 }
635
636 pub fn set_scalar_constant(&mut self, id: u32, value: u64) -> Result<(), ErrorCode> {
640 self.compiler.set_scalar_constant(id, value)
641 }
642
643 pub fn get_shader_resources(&self) -> Result<ShaderResources, ErrorCode> {
645 self.compiler.get_shader_resources()
646 }
647
648 pub fn get_type(&self, id: u32) -> Result<Type, ErrorCode> {
650 self.compiler.get_type(id)
651 }
652
653 pub fn get_member_name(&self, id: u32, index: u32) -> Result<String, ErrorCode> {
655 self.compiler.get_member_name(id, index)
656 }
657
658 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 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 pub fn get_declared_struct_size(&self, id: u32) -> Result<u32, ErrorCode> {
682 self.compiler.get_declared_struct_size(id)
683 }
684
685 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 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 pub fn get_active_interface_variables(&mut self) -> Result<HashSet<u32>, ErrorCode> {
703 self.compiler
704 .get_active_interface_variables()
705 }
706
707 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 pub fn parse(module: &Module) -> Result<Self, ErrorCode> {
716 Parse::<TTarget>::parse(&module)
717 }
718
719 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 pub fn compile(&mut self) -> Result<String, ErrorCode> {
729 self.compiler.has_been_compiled = true;
730 Compile::<TTarget>::compile(self)
731 }
732}