Attempt to enforce repr(C) with safer_ffi
This commit is contained in:
parent
fe75b39d01
commit
0b44972394
11 changed files with 53 additions and 43 deletions
|
@ -9,6 +9,6 @@ image = "0.24.5"
|
|||
vulkan-sys = { path = "../vulkan-sys" }
|
||||
vma-rs = { path = "../vma-rs" }
|
||||
anyhow = { version = "1.0.68", features = ["backtrace"] }
|
||||
cgmath = "0.18.0"
|
||||
assetpath = { path = "../assetpath" }
|
||||
safer-ffi = "0.0.10"
|
||||
cgmath = { git = "https://gavania.de/hodasemi/cgmath.git" }
|
||||
safer-ffi = { version = "0.0.10", features = ["proc_macros"] }
|
||||
|
|
|
@ -56,7 +56,7 @@ impl AccelerationStructureBuilder {
|
|||
self
|
||||
}
|
||||
|
||||
pub fn add_vertices<T: Send + Sync + 'static>(
|
||||
pub fn add_vertices<T: ReprC + Send + Sync + 'static>(
|
||||
mut self,
|
||||
vertex_buffer: &Arc<Buffer<T>>,
|
||||
transform: Option<Arc<Buffer<Matrix4<f32>>>>,
|
||||
|
|
|
@ -6,7 +6,7 @@ use std;
|
|||
use std::mem;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct BufferBuilder<'a, T> {
|
||||
pub struct BufferBuilder<'a, T: ReprC> {
|
||||
flags: VkBufferCreateFlagBits,
|
||||
usage: VkBufferUsageFlagBits,
|
||||
memory_usage: Option<MemoryUsage>,
|
||||
|
@ -17,7 +17,7 @@ pub struct BufferBuilder<'a, T> {
|
|||
alignment: Option<VkDeviceSize>,
|
||||
}
|
||||
|
||||
impl<'a, T> BufferBuilder<'a, T> {
|
||||
impl<'a, T: ReprC> BufferBuilder<'a, T> {
|
||||
pub fn set_memory_usage(mut self, usage: MemoryUsage) -> Self {
|
||||
self.memory_usage = Some(usage);
|
||||
|
||||
|
@ -61,7 +61,7 @@ impl<'a, T> BufferBuilder<'a, T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Clone + Send + Sync + 'static> BufferBuilder<'a, T> {
|
||||
impl<'a, T: ReprC + Clone + Send + Sync + 'static> BufferBuilder<'a, T> {
|
||||
pub fn build(self, device: Arc<Device>) -> Result<Arc<Buffer<T>>> {
|
||||
let size = match self.data {
|
||||
Some(data) => data.len() as VkDeviceSize,
|
||||
|
@ -122,7 +122,7 @@ impl<'a, T: Clone + Send + Sync + 'static> BufferBuilder<'a, T> {
|
|||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Buffer<T> {
|
||||
pub struct Buffer<T: ReprC> {
|
||||
device: Arc<Device>,
|
||||
buffer: VkBuffer,
|
||||
|
||||
|
@ -134,7 +134,7 @@ pub struct Buffer<T> {
|
|||
size: VkDeviceSize,
|
||||
}
|
||||
|
||||
impl<T: Clone + Send + Sync + 'static> Buffer<T> {
|
||||
impl<T: ReprC + Clone + Send + Sync + 'static> Buffer<T> {
|
||||
pub fn fill(&self, data: &[T]) -> Result<()> {
|
||||
let mut buffer_map = self.map(data.len() as VkDeviceSize)?;
|
||||
|
||||
|
@ -190,7 +190,7 @@ impl<T: Clone + Send + Sync + 'static> Buffer<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> Buffer<T> {
|
||||
impl<T: ReprC> Buffer<T> {
|
||||
pub fn builder<'a>() -> BufferBuilder<'a, T> {
|
||||
BufferBuilder {
|
||||
flags: 0u32.into(),
|
||||
|
@ -217,39 +217,39 @@ impl<T> Buffer<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> VulkanDevice for Buffer<T> {
|
||||
impl<T: ReprC> VulkanDevice for Buffer<T> {
|
||||
fn device(&self) -> &Arc<Device> {
|
||||
&self.device
|
||||
}
|
||||
}
|
||||
|
||||
impl_vk_handle_t!(Buffer, VkBuffer, buffer);
|
||||
impl_vk_handle_t!(Buffer[ReprC], VkBuffer, buffer);
|
||||
|
||||
impl<T> VkHandle<VkDeviceMemory> for Buffer<T> {
|
||||
impl<T: ReprC> VkHandle<VkDeviceMemory> for Buffer<T> {
|
||||
fn vk_handle(&self) -> VkDeviceMemory {
|
||||
self.memory.vk_handle()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> VkHandle<VkDeviceMemory> for &'a Buffer<T> {
|
||||
impl<'a, T: ReprC> VkHandle<VkDeviceMemory> for &'a Buffer<T> {
|
||||
fn vk_handle(&self) -> VkDeviceMemory {
|
||||
self.memory.vk_handle()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> VkHandle<VkDeviceMemory> for Arc<Buffer<T>> {
|
||||
impl<T: ReprC> VkHandle<VkDeviceMemory> for Arc<Buffer<T>> {
|
||||
fn vk_handle(&self) -> VkDeviceMemory {
|
||||
self.memory.vk_handle()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> VkHandle<VkDeviceMemory> for &'a Arc<Buffer<T>> {
|
||||
impl<'a, T: ReprC> VkHandle<VkDeviceMemory> for &'a Arc<Buffer<T>> {
|
||||
fn vk_handle(&self) -> VkDeviceMemory {
|
||||
self.memory.vk_handle()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Drop for Buffer<T> {
|
||||
impl<T: ReprC> Drop for Buffer<T> {
|
||||
fn drop(&mut self) {
|
||||
self.device.destroy_buffer(self.buffer);
|
||||
}
|
||||
|
@ -257,7 +257,7 @@ impl<T> Drop for Buffer<T> {
|
|||
|
||||
// use crate::{ffi::*, handle_ffi_result};
|
||||
|
||||
impl<T> FFIBufferTrait for Buffer<T> {
|
||||
impl<T: ReprC> FFIBufferTrait for Buffer<T> {
|
||||
fn byte_size(&self) -> VkDeviceSize {
|
||||
self.byte_size()
|
||||
}
|
||||
|
|
|
@ -226,7 +226,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn buffer_barrier<T: Send + Sync + 'static>(
|
||||
pub fn buffer_barrier<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
buffer: &Arc<Buffer<T>>,
|
||||
src_access_mask: impl Into<VkAccessFlagBits>,
|
||||
|
@ -446,7 +446,10 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn bind_vertex_buffer<T: Send + Sync + 'static>(&mut self, buffer: &Arc<Buffer<T>>) {
|
||||
pub fn bind_vertex_buffer<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
buffer: &Arc<Buffer<T>>,
|
||||
) {
|
||||
self.calls.fetch_add(1, SeqCst);
|
||||
|
||||
self.handles_lock.push(buffer.clone());
|
||||
|
@ -455,7 +458,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
.cmd_bind_vertex_buffers(self.buffer, 0, &[buffer.vk_handle()], &[0]);
|
||||
}
|
||||
|
||||
pub fn bind_vertex_buffers_minimal<T: Send + Sync + 'static>(
|
||||
pub fn bind_vertex_buffers_minimal<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
buffers: &[&Arc<Buffer<T>>],
|
||||
) {
|
||||
|
@ -480,7 +483,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn bind_index_buffer<T: Send + Sync + 'static>(
|
||||
pub fn bind_index_buffer<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
buffer: &Arc<Buffer<T>>,
|
||||
offset: VkDeviceSize,
|
||||
|
@ -673,7 +676,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
unimplemented!();
|
||||
}
|
||||
|
||||
pub fn copy_buffer<T: Send + Sync + 'static, U: Send + Sync + 'static>(
|
||||
pub fn copy_buffer<T: ReprC + Send + Sync + 'static, U: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
src_buffer: &Arc<Buffer<T>>,
|
||||
dst_buffer: &Arc<Buffer<U>>,
|
||||
|
@ -780,7 +783,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn copy_buffer_to_image<T: Send + Sync + 'static>(
|
||||
pub fn copy_buffer_to_image<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
src_buffer: &Arc<Buffer<T>>,
|
||||
dst_image: &Arc<Image>,
|
||||
|
@ -801,7 +804,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn copy_image_to_buffer<T: Send + Sync + 'static>(
|
||||
pub fn copy_image_to_buffer<T: ReprC + Send + Sync + 'static>(
|
||||
&mut self,
|
||||
src_image: &Arc<Image>,
|
||||
image_layout: VkImageLayout,
|
||||
|
@ -920,7 +923,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
pub fn build_acceleration_structure_indirect(
|
||||
&mut self,
|
||||
infos: &[VkAccelerationStructureBuildGeometryInfoKHR],
|
||||
indirect_buffers: &[Arc<Buffer<impl Send + Sync + 'static>>],
|
||||
indirect_buffers: &[Arc<Buffer<impl ReprC + Send + Sync + 'static>>],
|
||||
indirect_strides: &[u32],
|
||||
max_primitive_counts: &[&u32],
|
||||
) {
|
||||
|
@ -995,7 +998,7 @@ impl<'a> CommandBufferRecorder<'a> {
|
|||
pub fn trace_rays_indirect(
|
||||
&mut self,
|
||||
sbt: ShaderBindingTable,
|
||||
buffer: Arc<Buffer<impl Send + Sync + 'static>>,
|
||||
buffer: Arc<Buffer<impl ReprC + Send + Sync + 'static>>,
|
||||
) {
|
||||
self.handles_lock.push(buffer.clone());
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ enum InnerWrite {
|
|||
}
|
||||
|
||||
impl DescriptorWrite {
|
||||
pub fn uniform_buffers<T: Send + Sync + 'static>(
|
||||
pub fn uniform_buffers<T: ReprC + Send + Sync + 'static>(
|
||||
binding: u32,
|
||||
buffers: &[&Arc<Buffer<T>>],
|
||||
) -> Self {
|
||||
|
@ -52,7 +52,7 @@ impl DescriptorWrite {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn storage_buffers<T: Send + Sync + 'static>(
|
||||
pub fn storage_buffers<T: ReprC + Send + Sync + 'static>(
|
||||
binding: u32,
|
||||
buffers: &[&Arc<Buffer<T>>],
|
||||
) -> Self {
|
||||
|
|
|
@ -928,7 +928,7 @@ fn into_layout(image: &Arc<Image>, layout: VkImageLayout) -> Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn copy_buffer_to_image<T: Send + Sync + 'static>(
|
||||
fn copy_buffer_to_image<T: ReprC + Send + Sync + 'static>(
|
||||
device: &Arc<Device>,
|
||||
queue: &Arc<Mutex<Queue>>,
|
||||
buffer: &Arc<Buffer<T>>,
|
||||
|
|
|
@ -27,26 +27,26 @@ macro_rules! impl_vk_handle {
|
|||
}
|
||||
|
||||
macro_rules! impl_vk_handle_t {
|
||||
($struct_name:ident, $target_name:ident, $value:ident) => {
|
||||
impl<T> VkHandle<$target_name> for $struct_name<T> {
|
||||
($struct_name:ident $([$($t:ident $(,)? )* ])?, $target_name:ident, $value:ident) => {
|
||||
impl<T $(: $($t,)* )?> VkHandle<$target_name> for $struct_name<T> {
|
||||
fn vk_handle(&self) -> $target_name {
|
||||
self.$value
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> VkHandle<$target_name> for &'a $struct_name<T> {
|
||||
impl<'a, T $(: $($t,)* )?> VkHandle<$target_name> for &'a $struct_name<T> {
|
||||
fn vk_handle(&self) -> $target_name {
|
||||
self.$value
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> VkHandle<$target_name> for Arc<$struct_name<T>> {
|
||||
impl<T $(: $($t,)* )?> VkHandle<$target_name> for Arc<$struct_name<T>> {
|
||||
fn vk_handle(&self) -> $target_name {
|
||||
self.$value
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> VkHandle<$target_name> for &'a Arc<$struct_name<T>> {
|
||||
impl<'a, T $(: $($t,)* )?> VkHandle<$target_name> for &'a Arc<$struct_name<T>> {
|
||||
fn vk_handle(&self) -> $target_name {
|
||||
self.$value
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ impl Into<VmaMemoryUsage> for MemoryUsage {
|
|||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Memory<T> {
|
||||
pub struct Memory<T: ReprC> {
|
||||
device: Arc<Device>,
|
||||
|
||||
allocation: Allocation,
|
||||
|
@ -44,7 +44,7 @@ pub struct Memory<T> {
|
|||
data_type: PhantomData<T>,
|
||||
}
|
||||
|
||||
impl<T> Memory<T> {
|
||||
impl<T: ReprC> Memory<T> {
|
||||
pub(crate) fn forced_requirements(
|
||||
device: &Arc<Device>,
|
||||
memory_requirements: VkMemoryRequirements,
|
||||
|
@ -85,7 +85,7 @@ impl<T> Memory<T> {
|
|||
}
|
||||
}
|
||||
|
||||
trait MemoryBinder<T, K> {
|
||||
trait MemoryBinder<T, K: ReprC> {
|
||||
fn create_and_bind(
|
||||
device: &Arc<Device>,
|
||||
memory_requirements: VkMemoryRequirements,
|
||||
|
@ -94,7 +94,7 @@ trait MemoryBinder<T, K> {
|
|||
) -> Result<Arc<Memory<K>>>;
|
||||
}
|
||||
|
||||
impl<K> MemoryBinder<(), K> for Memory<K> {
|
||||
impl<K: ReprC> MemoryBinder<(), K> for Memory<K> {
|
||||
fn create_and_bind(
|
||||
device: &Arc<Device>,
|
||||
memory_requirements: VkMemoryRequirements,
|
||||
|
@ -118,7 +118,7 @@ impl<K> MemoryBinder<(), K> for Memory<K> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<K> MemoryBinder<VkImage, K> for Memory<K> {
|
||||
impl<K: ReprC> MemoryBinder<VkImage, K> for Memory<K> {
|
||||
fn create_and_bind(
|
||||
device: &Arc<Device>,
|
||||
memory_requirements: VkMemoryRequirements,
|
||||
|
@ -142,7 +142,7 @@ impl<K> MemoryBinder<VkImage, K> for Memory<K> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<K> MemoryBinder<VkBuffer, K> for Memory<K> {
|
||||
impl<K: ReprC> MemoryBinder<VkBuffer, K> for Memory<K> {
|
||||
fn create_and_bind(
|
||||
device: &Arc<Device>,
|
||||
memory_requirements: VkMemoryRequirements,
|
||||
|
@ -166,13 +166,13 @@ impl<K> MemoryBinder<VkBuffer, K> for Memory<K> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> VulkanDevice for Memory<T> {
|
||||
impl<T: ReprC> VulkanDevice for Memory<T> {
|
||||
fn device(&self) -> &Arc<Device> {
|
||||
&self.device
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Clone> Memory<T> {
|
||||
impl<T: ReprC + Clone> Memory<T> {
|
||||
pub fn map(&self, length: VkDeviceSize) -> Result<VkMappedMemory<'_, T>> {
|
||||
self.allocation.map(length)
|
||||
}
|
||||
|
|
|
@ -8,4 +8,5 @@ edition = "2021"
|
|||
library_loader = { path = "../library_loader" }
|
||||
paste = "1.0.11"
|
||||
shared_library = "0.1.9"
|
||||
anyhow = { version = "1.0.68", features = ["backtrace"] }
|
||||
anyhow = { version = "1.0.68", features = ["backtrace"] }
|
||||
safer-ffi = { version = "0.0.10", features = ["proc_macros"] }
|
|
@ -1,6 +1,8 @@
|
|||
use crate::prelude::*;
|
||||
use safer_ffi::prelude::*;
|
||||
use std::fmt;
|
||||
|
||||
#[derive_ReprC]
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
pub struct VkAccelerationStructureInstanceKHR {
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
use safer_ffi::prelude::*;
|
||||
|
||||
|
||||
#[derive_ReprC]
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||
pub struct VkTransformMatrixKHR {
|
||||
|
|
Loading…
Reference in a new issue