2023-01-21 17:54:06 +11:00
|
|
|
#![feature(doc_cfg)]
|
2022-12-05 14:37:03 +11:00
|
|
|
//! The C API for [librashader](https://docs.rs/librashader/).
|
|
|
|
//!
|
|
|
|
//! The librashader C API is designed to be loaded dynamically via `librashader_ld.h`, but static usage is also
|
|
|
|
//! possible by linking against `librashader.h` as well as any static libraries used by `librashader`.
|
|
|
|
//!
|
|
|
|
//! ## Usage
|
2023-01-14 09:59:22 +11:00
|
|
|
//! ⚠ Rust consumers use [librashader](https://docs.rs/librashader/) directly instead. ⚠
|
2022-12-05 14:37:03 +11:00
|
|
|
//!
|
2023-01-14 09:59:22 +11:00
|
|
|
//! The librashader C API is designed to be easy to use and safe. Most objects are only accessible behind an opaque pointer.
|
2022-12-05 14:37:03 +11:00
|
|
|
//! Every allocated object can be freed with a corresponding `free` function **for that specific object type**.
|
|
|
|
//!
|
|
|
|
//! Once an object is freed, the input pointer is always set to null. Attempting to free an object that was not
|
|
|
|
//! allocated from `librashader` or trying to free an object with a wrong `free` function results in
|
2022-12-05 15:54:47 +11:00
|
|
|
//! **immediate undefined behaviour**.
|
2022-12-05 14:37:03 +11:00
|
|
|
//!
|
|
|
|
//! In general, all functions will accept null pointers for all parameters. However, passing a null pointer
|
|
|
|
//! into any function that requires a non-null pointer will result in the function returning an error with code `INVALID_PARAMETER`.
|
|
|
|
//!
|
|
|
|
//! All types that begin with an underscore, such as `_libra_error` or `_shader_preset` are handles that
|
|
|
|
//! can not be constructed validly, and should always be used with pointer indirection via the corresponding `_t` types.
|
|
|
|
//!
|
2022-12-05 15:54:47 +11:00
|
|
|
//! All functions have safety invariants labeled `## Safety` that must be upheld. Failure to uphold these invariants
|
|
|
|
//! will result in **immediate undefined behaviour**. Generally speaking, all pointers passed to functions must be
|
|
|
|
//! **aligned** regardless of whether or not they are null.
|
|
|
|
//!
|
|
|
|
//! ## Booleans
|
|
|
|
//! Some option structs take `bool` values.
|
|
|
|
//! Any booleans passed to librashader **must have a bit pattern equivalent to either `1` or `0`**. Any other value will cause
|
2023-01-29 18:30:58 +11:00
|
|
|
//! **immediate undefined behaviour**. Using `_Bool` from `stdbool.h` should maintain this invariant.
|
2022-12-05 15:54:47 +11:00
|
|
|
//!
|
2022-12-05 14:37:03 +11:00
|
|
|
//! ## Errors
|
|
|
|
//! The librashader C API provides a robust, reflective error system. Every function returns a `libra_error_t`, which is either
|
|
|
|
//! a null pointer, or a handle to an opaque allocated error object. If the returned error is null, then the function was successful.
|
|
|
|
//! Otherwise, error information can be accessed via the `libra_error_` set of APIs. If an error indeed occurs, it may be freed by
|
|
|
|
//! `libra_error_free`.
|
2023-01-29 18:30:58 +11:00
|
|
|
//!
|
|
|
|
//! It is **highly recommended** to check for errors after every call to a librashader API like in the following example.
|
|
|
|
//!
|
|
|
|
//! ```c
|
|
|
|
//! libra_preset_t preset;
|
|
|
|
//! libra_error_t error = libra.preset_create(
|
|
|
|
//! "slang-shaders/crt/crt-lottes.slangp", &preset);
|
|
|
|
//! if (error != NULL) {
|
|
|
|
//! libra.error_print(error);
|
|
|
|
//! libra.error_free(&error);
|
|
|
|
//! exit(1);
|
|
|
|
//! }
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! There is a case to be made for skipping error checking for `*_filter_chain_frame` due to performance reasons,
|
|
|
|
//! but only if you are certain that the safety invariants are upheld on each call. Failure to check for errors
|
|
|
|
//! may result in **undefined behaviour** stemming from failure to uphold safety invariants.
|
2022-12-04 10:32:10 +11:00
|
|
|
#![allow(non_camel_case_types)]
|
|
|
|
#![feature(try_blocks)]
|
2023-01-14 16:27:35 +11:00
|
|
|
#![feature(pointer_is_aligned)]
|
2022-12-04 10:32:10 +11:00
|
|
|
#![feature(vec_into_raw_parts)]
|
|
|
|
#![deny(unsafe_op_in_unsafe_fn)]
|
|
|
|
|
|
|
|
pub mod ctypes;
|
2022-12-05 16:06:37 +11:00
|
|
|
pub mod error;
|
2022-12-04 10:32:10 +11:00
|
|
|
mod ffi;
|
2022-12-05 16:06:37 +11:00
|
|
|
pub mod presets;
|
2023-01-14 08:05:13 +11:00
|
|
|
|
|
|
|
#[cfg(feature = "reflect")]
|
2023-01-14 09:59:22 +11:00
|
|
|
#[doc(hidden)]
|
2023-01-03 10:22:52 +11:00
|
|
|
pub mod reflect;
|
2023-01-14 08:05:13 +11:00
|
|
|
|
2023-01-10 14:54:54 +11:00
|
|
|
pub mod runtime;
|