capi: replace unstable library features with polyfills

This commit is contained in:
chyyran 2024-02-16 01:12:48 -05:00 committed by Ronny Chan
parent 017a1a6232
commit d3d8e85461
7 changed files with 41 additions and 10 deletions

1
Cargo.lock generated
View file

@ -1548,6 +1548,7 @@ dependencies = [
"objc2 0.5.0",
"paste",
"rustc-hash",
"sptr",
"thiserror",
"windows 0.48.0",
]

View file

@ -36,6 +36,7 @@ gl = { version = "0.14.0", optional = true }
rustc-hash = "1.1.0"
ash = { version = "0.37", optional = true }
spirv_cross = { package = "librashader-spirv-cross", version = "0.25.1" }
sptr = "0.3.2"
[dependencies.librashader]
path = "../librashader"

View file

@ -206,12 +206,12 @@ impl LibrashaderError {
macro_rules! assert_non_null {
($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();
}
};
(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(
stringify!($value),
));

View file

@ -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 ffi_body;
use std::mem::ManuallyDrop;

View file

@ -65,11 +65,11 @@
#![allow(non_camel_case_types)]
#![feature(try_blocks)]
#![feature(pointer_is_aligned)]
#![feature(vec_into_raw_parts)]
#![deny(unsafe_op_in_unsafe_fn)]
#![deny(deprecated)]
extern crate alloc;
pub mod ctypes;
pub mod error;
mod ffi;

View file

@ -218,12 +218,15 @@ extern_fn! {
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 {
out.write(MaybeUninit::new(libra_preset_param_list_t {
parameters: parts,
length: len as u64,
_internal_alloc: cap as u64,
_internal_alloc: 0,
}));
}
}
@ -251,9 +254,9 @@ extern_fn! {
/// in undefined behaviour.
fn libra_preset_free_runtime_params(preset: libra_preset_param_list_t) {
unsafe {
let values = Vec::from_raw_parts(preset.parameters.cast_mut(),
preset.length as usize,
preset._internal_alloc as usize);
let values =
crate::ffi::boxed_slice_from_raw_parts(preset.parameters.cast_mut(),
preset.length as usize).into_vec();
for value in values {
let name = CString::from_raw(value.name.cast_mut());

View file

@ -39,7 +39,13 @@ int main()
libra_preset_param_list_t parameters;
error = instance.preset_get_runtime_params(&preset, &parameters);
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);