capi: replace unstable library features with polyfills
This commit is contained in:
parent
017a1a6232
commit
d3d8e85461
7 changed files with 41 additions and 10 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1548,6 +1548,7 @@ dependencies = [
|
||||||
"objc2 0.5.0",
|
"objc2 0.5.0",
|
||||||
"paste",
|
"paste",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
|
"sptr",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"windows 0.48.0",
|
"windows 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
|
@ -36,6 +36,7 @@ gl = { version = "0.14.0", optional = true }
|
||||||
rustc-hash = "1.1.0"
|
rustc-hash = "1.1.0"
|
||||||
ash = { version = "0.37", optional = true }
|
ash = { version = "0.37", optional = true }
|
||||||
spirv_cross = { package = "librashader-spirv-cross", version = "0.25.1" }
|
spirv_cross = { package = "librashader-spirv-cross", version = "0.25.1" }
|
||||||
|
sptr = "0.3.2"
|
||||||
|
|
||||||
[dependencies.librashader]
|
[dependencies.librashader]
|
||||||
path = "../librashader"
|
path = "../librashader"
|
||||||
|
|
|
@ -206,12 +206,12 @@ impl LibrashaderError {
|
||||||
|
|
||||||
macro_rules! assert_non_null {
|
macro_rules! assert_non_null {
|
||||||
($value:ident) => {
|
($value:ident) => {
|
||||||
if $value.is_null() || !$value.is_aligned() {
|
if $value.is_null() || !$crate::ffi::ptr_is_aligned($value) {
|
||||||
return $crate::error::LibrashaderError::InvalidParameter(stringify!($value)).export();
|
return $crate::error::LibrashaderError::InvalidParameter(stringify!($value)).export();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(noexport $value:ident) => {
|
(noexport $value:ident) => {
|
||||||
if $value.is_null() || !$value.is_aligned() {
|
if $value.is_null() || !$crate::ffi::ptr_is_aligned($value) {
|
||||||
return Err($crate::error::LibrashaderError::InvalidParameter(
|
return Err($crate::error::LibrashaderError::InvalidParameter(
|
||||||
stringify!($value),
|
stringify!($value),
|
||||||
));
|
));
|
||||||
|
|
|
@ -222,5 +222,25 @@ macro_rules! extern_fn {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn boxed_slice_into_raw_parts<T>(vec: Box<[T]>) -> (*mut T, usize) {
|
||||||
|
let mut me = ManuallyDrop::new(vec);
|
||||||
|
(me.as_mut_ptr(), me.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn boxed_slice_from_raw_parts<T>(ptr: *mut T, len: usize) -> Box<[T]> {
|
||||||
|
unsafe { Box::from_raw(std::slice::from_raw_parts_mut(ptr, len)) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unstable_name_collisions)]
|
||||||
|
pub fn ptr_is_aligned<T: Sized>(ptr: *const T) -> bool {
|
||||||
|
use sptr::Strict;
|
||||||
|
let align = std::mem::align_of::<T>();
|
||||||
|
if !align.is_power_of_two() {
|
||||||
|
panic!("is_aligned_to: align is not a power-of-two");
|
||||||
|
}
|
||||||
|
ptr.addr() & (align - 1) == 0
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) use extern_fn;
|
pub(crate) use extern_fn;
|
||||||
pub(crate) use ffi_body;
|
pub(crate) use ffi_body;
|
||||||
|
use std::mem::ManuallyDrop;
|
||||||
|
|
|
@ -65,11 +65,11 @@
|
||||||
|
|
||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
#![feature(try_blocks)]
|
#![feature(try_blocks)]
|
||||||
#![feature(pointer_is_aligned)]
|
|
||||||
#![feature(vec_into_raw_parts)]
|
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
#![deny(deprecated)]
|
#![deny(deprecated)]
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
pub mod ctypes;
|
pub mod ctypes;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
mod ffi;
|
mod ffi;
|
||||||
|
|
|
@ -218,12 +218,15 @@ extern_fn! {
|
||||||
step: param.step
|
step: param.step
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
let (parts, len, cap) = values.into_raw_parts();
|
|
||||||
|
let values = values.into_boxed_slice();
|
||||||
|
let (parts, len) = crate::ffi::boxed_slice_into_raw_parts(values);
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
out.write(MaybeUninit::new(libra_preset_param_list_t {
|
out.write(MaybeUninit::new(libra_preset_param_list_t {
|
||||||
parameters: parts,
|
parameters: parts,
|
||||||
length: len as u64,
|
length: len as u64,
|
||||||
_internal_alloc: cap as u64,
|
_internal_alloc: 0,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,9 +254,9 @@ extern_fn! {
|
||||||
/// in undefined behaviour.
|
/// in undefined behaviour.
|
||||||
fn libra_preset_free_runtime_params(preset: libra_preset_param_list_t) {
|
fn libra_preset_free_runtime_params(preset: libra_preset_param_list_t) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let values = Vec::from_raw_parts(preset.parameters.cast_mut(),
|
let values =
|
||||||
preset.length as usize,
|
crate::ffi::boxed_slice_from_raw_parts(preset.parameters.cast_mut(),
|
||||||
preset._internal_alloc as usize);
|
preset.length as usize).into_vec();
|
||||||
|
|
||||||
for value in values {
|
for value in values {
|
||||||
let name = CString::from_raw(value.name.cast_mut());
|
let name = CString::from_raw(value.name.cast_mut());
|
||||||
|
|
|
@ -39,7 +39,13 @@ int main()
|
||||||
libra_preset_param_list_t parameters;
|
libra_preset_param_list_t parameters;
|
||||||
error = instance.preset_get_runtime_params(&preset, ¶meters);
|
error = instance.preset_get_runtime_params(&preset, ¶meters);
|
||||||
|
|
||||||
libra_preset_param_t next = parameters.parameters[471];
|
for (int i = 0; i < parameters.length; i++) {
|
||||||
|
libra_preset_param_t param = parameters.parameters[i];
|
||||||
|
|
||||||
|
printf("%s\n", param.description);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
instance.preset_free_runtime_params(parameters);
|
instance.preset_free_runtime_params(parameters);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue