Skip to main content

shaderc_sys_dyn/
lib.rs

1// Copyright 2016 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Shaderc system library FFI with runtime dynamic loading
16//!
17//! This crate contains the lower-level C interface for the Shaderc library.
18//! For the higher-level Rust-friendly interface, please see the
19//! [shaderc](https://docs.rs/shaderc) crate.
20//!
21//! The [Shaderc](https://github.com/google/shaderc) library provides an API
22//! for compiling GLSL/HLSL source code to SPIRV modules. It has been shipping
23//! in the Android NDK since version r12b.
24//!
25//! This crate loads the shaderc shared library (`libshaderc_shared`) at runtime
26//! using `libloading` instead of statically linking at build time. The shared
27//! library must be installed and available on the system library search path,
28//! or its location can be specified via the `SHADERC_LIB_PATH` environment
29//! variable.
30
31#![allow(non_camel_case_types)]
32#![allow(clippy::missing_safety_doc)]
33
34use std::ffi::{c_char, c_int, c_void};
35use std::sync::OnceLock;
36
37// ---------------------------------------------------------------------------
38// Opaque C types (identical to upstream shaderc-sys)
39// ---------------------------------------------------------------------------
40
41pub enum ShadercCompiler {}
42pub enum ShadercCompileOptions {}
43pub enum ShadercCompilationResult {}
44
45// ---------------------------------------------------------------------------
46// Include callback types (identical to upstream shaderc-sys)
47// ---------------------------------------------------------------------------
48
49#[repr(C)]
50pub struct shaderc_include_result {
51    pub source_name: *const c_char,
52    pub source_name_length: usize,
53    pub content: *const c_char,
54    pub content_length: usize,
55    pub user_data: *mut c_void,
56}
57
58pub type shaderc_include_resolve_fn = extern "C" fn(
59    user_data: *mut c_void,
60    requested_source: *const c_char,
61    type_: c_int,
62    requesting_source: *const c_char,
63    include_depth: usize,
64) -> *mut shaderc_include_result;
65
66pub type shaderc_include_result_release_fn =
67    extern "C" fn(user_data: *mut c_void, include_result: *mut shaderc_include_result);
68
69// ---------------------------------------------------------------------------
70// Library loading
71// ---------------------------------------------------------------------------
72
73struct ShadercLibrary {
74    _lib: libloading::Library,
75    fns: ShadercFunctions,
76}
77
78/// All shaderc C function pointers loaded from the shared library.
79struct ShadercFunctions {
80    // Compiler
81    compiler_initialize: unsafe extern "C" fn() -> *mut ShadercCompiler,
82    compiler_release: unsafe extern "C" fn(*mut ShadercCompiler),
83
84    // Compilation
85    compile_into_spv: unsafe extern "C" fn(
86        *const ShadercCompiler,
87        *const c_char,
88        usize,
89        i32,
90        *const c_char,
91        *const c_char,
92        *const ShadercCompileOptions,
93    ) -> *mut ShadercCompilationResult,
94    compile_into_spv_assembly: unsafe extern "C" fn(
95        *const ShadercCompiler,
96        *const c_char,
97        usize,
98        i32,
99        *const c_char,
100        *const c_char,
101        *const ShadercCompileOptions,
102    ) -> *mut ShadercCompilationResult,
103    compile_into_preprocessed_text: unsafe extern "C" fn(
104        *const ShadercCompiler,
105        *const c_char,
106        usize,
107        i32,
108        *const c_char,
109        *const c_char,
110        *const ShadercCompileOptions,
111    ) -> *mut ShadercCompilationResult,
112    assemble_into_spv: unsafe extern "C" fn(
113        *const ShadercCompiler,
114        *const c_char,
115        usize,
116        *const ShadercCompileOptions,
117    ) -> *mut ShadercCompilationResult,
118
119    // Options
120    compile_options_initialize: unsafe extern "C" fn() -> *mut ShadercCompileOptions,
121    compile_options_clone:
122        unsafe extern "C" fn(*const ShadercCompileOptions) -> *mut ShadercCompileOptions,
123    compile_options_release: unsafe extern "C" fn(*mut ShadercCompileOptions),
124    compile_options_add_macro_definition: unsafe extern "C" fn(
125        *mut ShadercCompileOptions,
126        *const c_char,
127        usize,
128        *const c_char,
129        usize,
130    ),
131    compile_options_set_source_language: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
132    compile_options_set_generate_debug_info: unsafe extern "C" fn(*mut ShadercCompileOptions),
133    compile_options_set_optimization_level: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
134    compile_options_set_forced_version_profile:
135        unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, i32),
136    compile_options_set_include_callbacks: unsafe extern "C" fn(
137        *mut ShadercCompileOptions,
138        shaderc_include_resolve_fn,
139        shaderc_include_result_release_fn,
140        *mut c_void,
141    ),
142    compile_options_set_suppress_warnings: unsafe extern "C" fn(*mut ShadercCompileOptions),
143    compile_options_set_warnings_as_errors: unsafe extern "C" fn(*mut ShadercCompileOptions),
144    compile_options_set_target_env: unsafe extern "C" fn(*mut ShadercCompileOptions, i32, u32),
145    compile_options_set_target_spirv: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
146    compile_options_set_limit: unsafe extern "C" fn(*mut ShadercCompileOptions, i32, c_int),
147    compile_options_set_auto_bind_uniforms: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
148    compile_options_set_auto_combined_image_sampler:
149        unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
150    compile_options_set_hlsl_io_mapping: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
151    compile_options_set_hlsl_offsets: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
152    compile_options_set_binding_base: unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, u32),
153    compile_options_set_binding_base_for_stage:
154        unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, c_int, u32),
155    compile_options_set_hlsl_register_set_and_binding: unsafe extern "C" fn(
156        *mut ShadercCompileOptions,
157        *const c_char,
158        *const c_char,
159        *const c_char,
160    ),
161    compile_options_set_auto_map_locations: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
162    compile_options_set_hlsl_register_set_and_binding_for_stage: unsafe extern "C" fn(
163        *mut ShadercCompileOptions,
164        c_int,
165        *const c_char,
166        *const c_char,
167        *const c_char,
168    ),
169    compile_options_set_hlsl_functionality1: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
170    compile_options_set_invert_y: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
171    compile_options_set_nan_clamp: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
172
173    // Results
174    result_release: unsafe extern "C" fn(*mut ShadercCompilationResult),
175    result_get_compilation_status: unsafe extern "C" fn(*const ShadercCompilationResult) -> i32,
176    result_get_num_errors: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
177    result_get_num_warnings: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
178    result_get_error_message:
179        unsafe extern "C" fn(*const ShadercCompilationResult) -> *const c_char,
180    result_get_length: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
181    result_get_bytes: unsafe extern "C" fn(*const ShadercCompilationResult) -> *const c_char,
182
183    // Utility
184    get_spv_version: unsafe extern "C" fn(*mut c_int, *mut c_int),
185    parse_version_profile: unsafe extern "C" fn(*const c_char, *mut c_int, *mut i32) -> bool,
186}
187
188/// Attempts to load the shaderc shared library from the system.
189fn load_library() -> Option<ShadercLibrary> {
190    let lib_name = if let Ok(path) = std::env::var("SHADERC_LIB_PATH") {
191        path
192    } else if cfg!(target_os = "windows") {
193        "shaderc_shared.dll".to_owned()
194    } else if cfg!(target_os = "macos") {
195        "libshaderc_shared.dylib".to_owned()
196    } else {
197        "libshaderc_shared.so".to_owned()
198    };
199
200    let lib = unsafe { libloading::Library::new(&lib_name) }.ok()?;
201
202    /// Helper macro to load a symbol or return `None`.
203    macro_rules! load {
204        ($lib:expr, $name:literal) => {
205            *unsafe { $lib.get::<_>($name) }.ok()?
206        };
207    }
208
209    let fns = ShadercFunctions {
210        compiler_initialize: load!(lib, b"shaderc_compiler_initialize\0"),
211        compiler_release: load!(lib, b"shaderc_compiler_release\0"),
212        compile_into_spv: load!(lib, b"shaderc_compile_into_spv\0"),
213        compile_into_spv_assembly: load!(lib, b"shaderc_compile_into_spv_assembly\0"),
214        compile_into_preprocessed_text: load!(lib, b"shaderc_compile_into_preprocessed_text\0"),
215        assemble_into_spv: load!(lib, b"shaderc_assemble_into_spv\0"),
216        compile_options_initialize: load!(lib, b"shaderc_compile_options_initialize\0"),
217        compile_options_clone: load!(lib, b"shaderc_compile_options_clone\0"),
218        compile_options_release: load!(lib, b"shaderc_compile_options_release\0"),
219        compile_options_add_macro_definition: load!(
220            lib,
221            b"shaderc_compile_options_add_macro_definition\0"
222        ),
223        compile_options_set_source_language: load!(
224            lib,
225            b"shaderc_compile_options_set_source_language\0"
226        ),
227        compile_options_set_generate_debug_info: load!(
228            lib,
229            b"shaderc_compile_options_set_generate_debug_info\0"
230        ),
231        compile_options_set_optimization_level: load!(
232            lib,
233            b"shaderc_compile_options_set_optimization_level\0"
234        ),
235        compile_options_set_forced_version_profile: load!(
236            lib,
237            b"shaderc_compile_options_set_forced_version_profile\0"
238        ),
239        compile_options_set_include_callbacks: load!(
240            lib,
241            b"shaderc_compile_options_set_include_callbacks\0"
242        ),
243        compile_options_set_suppress_warnings: load!(
244            lib,
245            b"shaderc_compile_options_set_suppress_warnings\0"
246        ),
247        compile_options_set_warnings_as_errors: load!(
248            lib,
249            b"shaderc_compile_options_set_warnings_as_errors\0"
250        ),
251        compile_options_set_target_env: load!(lib, b"shaderc_compile_options_set_target_env\0"),
252        compile_options_set_target_spirv: load!(lib, b"shaderc_compile_options_set_target_spirv\0"),
253        compile_options_set_limit: load!(lib, b"shaderc_compile_options_set_limit\0"),
254        compile_options_set_auto_bind_uniforms: load!(
255            lib,
256            b"shaderc_compile_options_set_auto_bind_uniforms\0"
257        ),
258        compile_options_set_auto_combined_image_sampler: load!(
259            lib,
260            b"shaderc_compile_options_set_auto_combined_image_sampler\0"
261        ),
262        compile_options_set_hlsl_io_mapping: load!(
263            lib,
264            b"shaderc_compile_options_set_hlsl_io_mapping\0"
265        ),
266        compile_options_set_hlsl_offsets: load!(lib, b"shaderc_compile_options_set_hlsl_offsets\0"),
267        compile_options_set_binding_base: load!(lib, b"shaderc_compile_options_set_binding_base\0"),
268        compile_options_set_binding_base_for_stage: load!(
269            lib,
270            b"shaderc_compile_options_set_binding_base_for_stage\0"
271        ),
272        compile_options_set_hlsl_register_set_and_binding: load!(
273            lib,
274            b"shaderc_compile_options_set_hlsl_register_set_and_binding\0"
275        ),
276        compile_options_set_auto_map_locations: load!(
277            lib,
278            b"shaderc_compile_options_set_auto_map_locations\0"
279        ),
280        compile_options_set_hlsl_register_set_and_binding_for_stage: load!(
281            lib,
282            b"shaderc_compile_options_set_hlsl_register_set_and_binding_for_stage\0"
283        ),
284        compile_options_set_hlsl_functionality1: load!(
285            lib,
286            b"shaderc_compile_options_set_hlsl_functionality1\0"
287        ),
288        compile_options_set_invert_y: load!(lib, b"shaderc_compile_options_set_invert_y\0"),
289        compile_options_set_nan_clamp: load!(lib, b"shaderc_compile_options_set_nan_clamp\0"),
290        result_release: load!(lib, b"shaderc_result_release\0"),
291        result_get_compilation_status: load!(lib, b"shaderc_result_get_compilation_status\0"),
292        result_get_num_errors: load!(lib, b"shaderc_result_get_num_errors\0"),
293        result_get_num_warnings: load!(lib, b"shaderc_result_get_num_warnings\0"),
294        result_get_error_message: load!(lib, b"shaderc_result_get_error_message\0"),
295        result_get_length: load!(lib, b"shaderc_result_get_length\0"),
296        result_get_bytes: load!(lib, b"shaderc_result_get_bytes\0"),
297        get_spv_version: load!(lib, b"shaderc_get_spv_version\0"),
298        parse_version_profile: load!(lib, b"shaderc_parse_version_profile\0"),
299    };
300
301    Some(ShadercLibrary { _lib: lib, fns })
302}
303
304static LIB: OnceLock<Option<ShadercLibrary>> = OnceLock::new();
305
306fn lib() -> Option<&'static ShadercLibrary> {
307    LIB.get_or_init(load_library).as_ref()
308}
309
310fn expect_lib() -> &'static ShadercLibrary {
311    lib().expect(
312        "shaderc shared library not loaded. \
313         Install libshaderc_shared (via Vulkan SDK, `brew install shaderc`, \
314         or `apt install libshaderc-dev`) and ensure it is on the library search path, \
315         or set SHADERC_LIB_PATH to the full path of the shared library.",
316    )
317}
318
319// ---------------------------------------------------------------------------
320// Public API — same signatures as upstream shaderc-sys extern "C" block
321// ---------------------------------------------------------------------------
322
323// -- Compiler ---------------------------------------------------------------
324
325pub unsafe fn shaderc_compiler_initialize() -> *mut ShadercCompiler {
326    match lib() {
327        Some(l) => unsafe { (l.fns.compiler_initialize)() },
328        None => std::ptr::null_mut(),
329    }
330}
331
332pub unsafe fn shaderc_compiler_release(compiler: *mut ShadercCompiler) {
333    unsafe { (expect_lib().fns.compiler_release)(compiler) };
334}
335
336// -- Compilation ------------------------------------------------------------
337
338pub unsafe fn shaderc_compile_into_spv(
339    compiler: *const ShadercCompiler,
340    source_text: *const c_char,
341    source_size: usize,
342    shader_kind: i32,
343    input_file_name: *const c_char,
344    entry_point_name: *const c_char,
345    additional_options: *const ShadercCompileOptions,
346) -> *mut ShadercCompilationResult {
347    unsafe {
348        (expect_lib().fns.compile_into_spv)(
349            compiler,
350            source_text,
351            source_size,
352            shader_kind,
353            input_file_name,
354            entry_point_name,
355            additional_options,
356        )
357    }
358}
359
360pub unsafe fn shaderc_compile_into_spv_assembly(
361    compiler: *const ShadercCompiler,
362    source_text: *const c_char,
363    source_size: usize,
364    shader_kind: i32,
365    input_file_name: *const c_char,
366    entry_point_name: *const c_char,
367    additional_options: *const ShadercCompileOptions,
368) -> *mut ShadercCompilationResult {
369    unsafe {
370        (expect_lib().fns.compile_into_spv_assembly)(
371            compiler,
372            source_text,
373            source_size,
374            shader_kind,
375            input_file_name,
376            entry_point_name,
377            additional_options,
378        )
379    }
380}
381
382pub unsafe fn shaderc_compile_into_preprocessed_text(
383    compiler: *const ShadercCompiler,
384    source_text: *const c_char,
385    source_size: usize,
386    shader_kind: i32,
387    input_file_name: *const c_char,
388    entry_point_name: *const c_char,
389    additional_options: *const ShadercCompileOptions,
390) -> *mut ShadercCompilationResult {
391    unsafe {
392        (expect_lib().fns.compile_into_preprocessed_text)(
393            compiler,
394            source_text,
395            source_size,
396            shader_kind,
397            input_file_name,
398            entry_point_name,
399            additional_options,
400        )
401    }
402}
403
404pub unsafe fn shaderc_assemble_into_spv(
405    compiler: *const ShadercCompiler,
406    source_assembly: *const c_char,
407    source_size: usize,
408    additional_options: *const ShadercCompileOptions,
409) -> *mut ShadercCompilationResult {
410    unsafe {
411        (expect_lib().fns.assemble_into_spv)(
412            compiler,
413            source_assembly,
414            source_size,
415            additional_options,
416        )
417    }
418}
419
420// -- Options ----------------------------------------------------------------
421
422pub unsafe fn shaderc_compile_options_initialize() -> *mut ShadercCompileOptions {
423    match lib() {
424        Some(l) => unsafe { (l.fns.compile_options_initialize)() },
425        None => std::ptr::null_mut(),
426    }
427}
428
429pub unsafe fn shaderc_compile_options_clone(
430    options: *const ShadercCompileOptions,
431) -> *mut ShadercCompileOptions {
432    match lib() {
433        Some(l) => unsafe { (l.fns.compile_options_clone)(options) },
434        None => std::ptr::null_mut(),
435    }
436}
437
438pub unsafe fn shaderc_compile_options_release(options: *mut ShadercCompileOptions) {
439    unsafe { (expect_lib().fns.compile_options_release)(options) };
440}
441
442pub unsafe fn shaderc_compile_options_add_macro_definition(
443    options: *mut ShadercCompileOptions,
444    name: *const c_char,
445    name_length: usize,
446    value: *const c_char,
447    value_length: usize,
448) {
449    unsafe {
450        (expect_lib().fns.compile_options_add_macro_definition)(
451            options,
452            name,
453            name_length,
454            value,
455            value_length,
456        )
457    };
458}
459
460pub unsafe fn shaderc_compile_options_set_source_language(
461    options: *mut ShadercCompileOptions,
462    language: i32,
463) {
464    unsafe { (expect_lib().fns.compile_options_set_source_language)(options, language) };
465}
466
467pub unsafe fn shaderc_compile_options_set_generate_debug_info(options: *mut ShadercCompileOptions) {
468    unsafe { (expect_lib().fns.compile_options_set_generate_debug_info)(options) };
469}
470
471pub unsafe fn shaderc_compile_options_set_optimization_level(
472    options: *mut ShadercCompileOptions,
473    level: i32,
474) {
475    unsafe { (expect_lib().fns.compile_options_set_optimization_level)(options, level) };
476}
477
478pub unsafe fn shaderc_compile_options_set_forced_version_profile(
479    options: *mut ShadercCompileOptions,
480    version: c_int,
481    profile: i32,
482) {
483    unsafe {
484        (expect_lib().fns.compile_options_set_forced_version_profile)(options, version, profile)
485    };
486}
487
488pub unsafe fn shaderc_compile_options_set_include_callbacks(
489    options: *mut ShadercCompileOptions,
490    resolver: shaderc_include_resolve_fn,
491    result_releaser: shaderc_include_result_release_fn,
492    user_data: *mut c_void,
493) {
494    unsafe {
495        (expect_lib().fns.compile_options_set_include_callbacks)(
496            options,
497            resolver,
498            result_releaser,
499            user_data,
500        )
501    };
502}
503
504pub unsafe fn shaderc_compile_options_set_suppress_warnings(options: *mut ShadercCompileOptions) {
505    unsafe { (expect_lib().fns.compile_options_set_suppress_warnings)(options) };
506}
507
508pub unsafe fn shaderc_compile_options_set_warnings_as_errors(options: *mut ShadercCompileOptions) {
509    unsafe { (expect_lib().fns.compile_options_set_warnings_as_errors)(options) };
510}
511
512pub unsafe fn shaderc_compile_options_set_target_env(
513    options: *mut ShadercCompileOptions,
514    env: i32,
515    version: u32,
516) {
517    unsafe { (expect_lib().fns.compile_options_set_target_env)(options, env, version) };
518}
519
520pub unsafe fn shaderc_compile_options_set_target_spirv(
521    options: *mut ShadercCompileOptions,
522    version: i32,
523) {
524    unsafe { (expect_lib().fns.compile_options_set_target_spirv)(options, version) };
525}
526
527pub unsafe fn shaderc_compile_options_set_limit(
528    options: *mut ShadercCompileOptions,
529    limit: i32,
530    value: c_int,
531) {
532    unsafe { (expect_lib().fns.compile_options_set_limit)(options, limit, value) };
533}
534
535pub unsafe fn shaderc_compile_options_set_auto_bind_uniforms(
536    options: *mut ShadercCompileOptions,
537    auto_bind: bool,
538) {
539    unsafe { (expect_lib().fns.compile_options_set_auto_bind_uniforms)(options, auto_bind) };
540}
541
542pub unsafe fn shaderc_compile_options_set_auto_combined_image_sampler(
543    options: *mut ShadercCompileOptions,
544    auto_combine: bool,
545) {
546    unsafe {
547        (expect_lib()
548            .fns
549            .compile_options_set_auto_combined_image_sampler)(options, auto_combine)
550    };
551}
552
553pub unsafe fn shaderc_compile_options_set_hlsl_io_mapping(
554    options: *mut ShadercCompileOptions,
555    hlsl_iomap: bool,
556) {
557    unsafe { (expect_lib().fns.compile_options_set_hlsl_io_mapping)(options, hlsl_iomap) };
558}
559
560pub unsafe fn shaderc_compile_options_set_hlsl_offsets(
561    options: *mut ShadercCompileOptions,
562    hlsl_offsets: bool,
563) {
564    unsafe { (expect_lib().fns.compile_options_set_hlsl_offsets)(options, hlsl_offsets) };
565}
566
567pub unsafe fn shaderc_compile_options_set_binding_base(
568    options: *mut ShadercCompileOptions,
569    resource_kind: c_int,
570    base: u32,
571) {
572    unsafe { (expect_lib().fns.compile_options_set_binding_base)(options, resource_kind, base) };
573}
574
575pub unsafe fn shaderc_compile_options_set_binding_base_for_stage(
576    options: *mut ShadercCompileOptions,
577    shader_kind: c_int,
578    resource_kind: c_int,
579    base: u32,
580) {
581    unsafe {
582        (expect_lib().fns.compile_options_set_binding_base_for_stage)(
583            options,
584            shader_kind,
585            resource_kind,
586            base,
587        )
588    };
589}
590
591pub unsafe fn shaderc_compile_options_set_hlsl_register_set_and_binding(
592    options: *mut ShadercCompileOptions,
593    register: *const c_char,
594    set: *const c_char,
595    binding: *const c_char,
596) {
597    unsafe {
598        (expect_lib()
599            .fns
600            .compile_options_set_hlsl_register_set_and_binding)(
601            options, register, set, binding
602        )
603    };
604}
605
606pub unsafe fn shaderc_compile_options_set_auto_map_locations(
607    options: *mut ShadercCompileOptions,
608    auto_map: bool,
609) {
610    unsafe { (expect_lib().fns.compile_options_set_auto_map_locations)(options, auto_map) };
611}
612
613pub unsafe fn shaderc_compile_options_set_hlsl_register_set_and_binding_for_stage(
614    options: *mut ShadercCompileOptions,
615    shader_kind: c_int,
616    register: *const c_char,
617    set: *const c_char,
618    binding: *const c_char,
619) {
620    unsafe {
621        (expect_lib()
622            .fns
623            .compile_options_set_hlsl_register_set_and_binding_for_stage)(
624            options,
625            shader_kind,
626            register,
627            set,
628            binding,
629        )
630    };
631}
632
633pub unsafe fn shaderc_compile_options_set_hlsl_functionality1(
634    options: *mut ShadercCompileOptions,
635    enable: bool,
636) {
637    unsafe { (expect_lib().fns.compile_options_set_hlsl_functionality1)(options, enable) };
638}
639
640pub unsafe fn shaderc_compile_options_set_invert_y(
641    options: *mut ShadercCompileOptions,
642    enable: bool,
643) {
644    unsafe { (expect_lib().fns.compile_options_set_invert_y)(options, enable) };
645}
646
647pub unsafe fn shaderc_compile_options_set_nan_clamp(
648    options: *mut ShadercCompileOptions,
649    enable: bool,
650) {
651    unsafe { (expect_lib().fns.compile_options_set_nan_clamp)(options, enable) };
652}
653
654// -- Results ----------------------------------------------------------------
655
656pub unsafe fn shaderc_result_release(result: *mut ShadercCompilationResult) {
657    unsafe { (expect_lib().fns.result_release)(result) };
658}
659
660pub unsafe fn shaderc_result_get_compilation_status(
661    result: *const ShadercCompilationResult,
662) -> i32 {
663    unsafe { (expect_lib().fns.result_get_compilation_status)(result) }
664}
665
666pub unsafe fn shaderc_result_get_num_errors(result: *const ShadercCompilationResult) -> usize {
667    unsafe { (expect_lib().fns.result_get_num_errors)(result) }
668}
669
670pub unsafe fn shaderc_result_get_num_warnings(result: *const ShadercCompilationResult) -> usize {
671    unsafe { (expect_lib().fns.result_get_num_warnings)(result) }
672}
673
674pub unsafe fn shaderc_result_get_error_message(
675    result: *const ShadercCompilationResult,
676) -> *const c_char {
677    unsafe { (expect_lib().fns.result_get_error_message)(result) }
678}
679
680pub unsafe fn shaderc_result_get_length(result: *const ShadercCompilationResult) -> usize {
681    unsafe { (expect_lib().fns.result_get_length)(result) }
682}
683
684pub unsafe fn shaderc_result_get_bytes(result: *const ShadercCompilationResult) -> *const c_char {
685    unsafe { (expect_lib().fns.result_get_bytes)(result) }
686}
687
688// -- Utility ----------------------------------------------------------------
689
690pub unsafe fn shaderc_get_spv_version(version: *mut c_int, revision: *mut c_int) {
691    unsafe { (expect_lib().fns.get_spv_version)(version, revision) };
692}
693
694pub unsafe fn shaderc_parse_version_profile(
695    str: *const c_char,
696    version: *mut c_int,
697    profile: *mut i32,
698) -> bool {
699    unsafe { (expect_lib().fns.parse_version_profile)(str, version, profile) }
700}