Use impl_reprc macro

This commit is contained in:
hodasemi 2023-02-01 14:32:30 +01:00
parent 60903547e7
commit 7901c3d9f0
10 changed files with 79 additions and 42 deletions

View file

@ -10,5 +10,4 @@ vulkan-sys = { path = "../vulkan-sys" }
vma-rs = { path = "../vma-rs" }
anyhow = { version = "1.0.68", features = ["backtrace"] }
assetpath = { path = "../assetpath" }
safer-ffi = { version = "0.0.10", features = ["proc_macros"] }
utilities = { git = "https://gavania.de/hodasemi/utilities.git" }

View file

@ -3,6 +3,7 @@ use crate::prelude::*;
use anyhow::Result;
use cgmath::{Matrix, Matrix4, One};
use utilities::impl_reprc;
use core::slice;
use std::{
@ -10,6 +11,19 @@ use std::{
sync::{Arc, Mutex},
};
impl_reprc!(
pub struct Transform {
#[assume_reprc]
m: Matrix4<f32>,
}
);
impl From<Matrix4<f32>> for Transform {
fn from(m: Matrix4<f32>) -> Self {
Self { m }
}
}
enum AccelerationStructureBuilderData {
TopLevel(Vec<VkAccelerationStructureInstanceKHR>),
BottomLevel(Vec<VkAccelerationStructureGeometryKHR>, Vec<u32>),
@ -59,7 +73,7 @@ impl AccelerationStructureBuilder {
pub fn add_vertices<T: ReprC + Send + Sync + 'static>(
mut self,
vertex_buffer: &Arc<Buffer<T>>,
transform: Option<Arc<Buffer<Matrix4<f32>>>>,
transform: Option<Arc<Buffer<Transform>>>,
flags: impl Into<VkGeometryFlagBitsKHR>,
) -> Self {
match &mut self.data {
@ -261,8 +275,8 @@ pub struct AccelerationStructure {
acceleration_structure: VkAccelerationStructureKHR,
result_buffer: Arc<Buffer<u8>>,
scratch_buffer: Mutex<Arc<Buffer<u8>>>,
result_buffer: Arc<Buffer<RawBuffer>>,
scratch_buffer: Mutex<Arc<Buffer<RawBuffer>>>,
update_scratch_buffer_size: VkDeviceSize,
@ -289,7 +303,7 @@ impl AccelerationStructure {
}
}
pub fn result_buffer(&self) -> &Arc<Buffer<u8>> {
pub fn result_buffer(&self) -> &Arc<Buffer<RawBuffer>> {
&self.result_buffer
}
@ -379,7 +393,7 @@ impl AccelerationStructure {
device: &Arc<Device>,
size: VkDeviceSize,
alignment: VkDeviceSize,
) -> Result<Arc<Buffer<u8>>> {
) -> Result<Arc<Buffer<RawBuffer>>> {
Buffer::builder()
.set_usage(
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,

View file

@ -143,12 +143,12 @@ impl ImageBuilder {
Ok(image)
}
ImageBuilderInternalType::NewImage(ref info) => match info.source_type {
ImageBuilderInternalType::NewImage(info) => match info.source_type {
ImageSourceType::Array(ref array) => {
let arc_image = Self::create_from_source(
device,
queue,
info,
&info,
self.sampler,
image_view_ci,
self.file_name,
@ -162,13 +162,20 @@ impl ImageBuilder {
let arc_image = Self::create_from_source(
device,
queue,
info,
&info,
self.sampler,
image_view_ci,
self.file_name,
)?;
Self::optimize_fill(device, queue, raw, &arc_image)?;
Self::optimize_fill(
device,
queue,
&raw.into_iter()
.map(|&d| RawBuffer { d })
.collect::<Vec<RawBuffer>>(),
&arc_image,
)?;
Ok(arc_image)
}
@ -176,7 +183,7 @@ impl ImageBuilder {
let arc_image = Self::create_from_source(
device,
queue,
info,
&info,
self.sampler,
image_view_ci,
self.file_name,
@ -421,7 +428,7 @@ impl ImageBuilder {
fn create_texture(
device: &Arc<Device>,
image_ci: &VkImageCreateInfo,
) -> Result<(VkImage, Arc<Memory<u8>>)> {
) -> Result<(VkImage, Arc<Memory<RawBuffer>>)> {
let image = Self::create_image(device, image_ci)?;
let memory = Memory::image_memory(
device,
@ -439,7 +446,7 @@ impl ImageBuilder {
fn optimize_fill(
device: &Arc<Device>,
queue: &Arc<Mutex<Queue>>,
data: &[u8],
data: &[RawBuffer],
image: &Arc<Image>,
) -> Result<()> {
let staging_buffer = Buffer::builder()
@ -476,7 +483,7 @@ pub struct Image {
image_view: VkImageView,
// optional handles
_memory: Option<Arc<Memory<u8>>>,
_memory: Option<Arc<Memory<RawBuffer>>>,
sampler: Option<Arc<Sampler>>,
// image information
@ -792,7 +799,7 @@ impl Image {
let image = image::RgbaImage::from_raw(
self.width,
self.height,
memory.iter().map(|&v| v).collect(),
memory.iter().map(|&v| v.d).collect(),
)
.ok_or(anyhow::anyhow!(
"failed to create image from raw while saving to file: {:?}",
@ -804,7 +811,7 @@ impl Image {
Ok(())
}
fn copy_image_to_buffer(self: &Arc<Image>) -> Result<Arc<Buffer<u8>>> {
fn copy_image_to_buffer(self: &Arc<Image>) -> Result<Arc<Buffer<RawBuffer>>> {
let buffer = Buffer::builder()
.set_usage(VK_BUFFER_USAGE_TRANSFER_DST_BIT)
.set_memory_usage(MemoryUsage::GpuToCpu)

View file

@ -2,11 +2,20 @@ use crate::prelude::*;
use anyhow::Result;
use utilities::impl_reprc;
use vma_rs::prelude::*;
use std::marker::PhantomData;
use std::sync::Arc;
impl_reprc!(
#[derive(Debug, Copy)]
pub struct RawBuffer {
#[assume_reprc]
d: u8,
}
);
#[derive(Debug, Clone, PartialEq, Hash, Eq)]
pub enum MemoryUsage {
GpuOnly,

View file

@ -15,7 +15,7 @@ pub(crate) struct ShaderBindingTableBuilder {
}
pub struct ShaderBindingTable {
_sbt_buffer: Arc<Buffer<u8>>,
_sbt_buffer: Arc<Buffer<RawBuffer>>,
raygen_shader_binding_table: VkStridedDeviceAddressRegionKHR,
miss_shader_binding_table: VkStridedDeviceAddressRegionKHR,
@ -41,7 +41,7 @@ impl ShaderBindingTable {
}
fn create(
sbt_buffer: Arc<Buffer<u8>>,
sbt_buffer: Arc<Buffer<RawBuffer>>,
ray_gen_entry_size: VkDeviceSize,
ray_gen_entry_count: VkDeviceSize,
miss_offset: VkDeviceSize,
@ -201,7 +201,13 @@ impl ShaderBindingTableBuilder {
| VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
)
.set_memory_usage(MemoryUsage::CpuToGpu)
.set_data(&sbt_data)
.set_data(
sbt_data
.into_iter()
.map(|u| RawBuffer { d: u })
.collect::<Vec<RawBuffer>>()
.as_slice(),
)
.build(device.clone())?;
Ok(ShaderBindingTable::create(

View file

@ -13,7 +13,7 @@ pub use super::fence::Fence;
pub use super::framebuffer::{Framebuffer, FramebufferBuilder};
pub use super::image::*;
pub use super::instance::*;
pub use super::memory::{Memory, MemoryUsage};
pub use super::memory::{Memory, MemoryUsage, RawBuffer};
pub use super::physicaldevice::PhysicalDevice;
pub use super::pipeline::Pipeline;
pub use super::pipelinecache::PipelineCache;
@ -46,10 +46,9 @@ pub use super::{OutOfDate, VkHandle, VulkanDevice};
pub use image;
pub use utilities::prelude::cgmath;
pub use utilities::prelude::cgmath::prelude::*;
pub use utilities::prelude::*;
pub use vulkan_sys::prelude::*;
pub use super::render_target::{sub_pass::*, *};
pub use super::single_submit::SingleSubmit;
pub use safer_ffi::prelude::*;

View file

@ -51,7 +51,7 @@ impl Default for ShaderType {
}
}
pub trait VertexInputDescription: ReprC {
pub trait VertexInputDescription: ReprC + Sized {
fn bindings() -> Vec<VkVertexInputBindingDescription> {
vec![VkVertexInputBindingDescription {
binding: 0,

View file

@ -9,4 +9,4 @@ library_loader = { path = "../library_loader" }
paste = "1.0.11"
shared_library = "0.1.9"
anyhow = { version = "1.0.68", features = ["backtrace"] }
safer-ffi = { version = "0.0.10", features = ["proc_macros"] }
utilities = { git = "https://gavania.de/hodasemi/utilities.git" }

View file

@ -1,16 +1,19 @@
use crate::prelude::*;
use safer_ffi::prelude::*;
use std::fmt;
use utilities::{impl_reprc, prelude::*};
#[derive_ReprC]
#[repr(C)]
#[derive(Copy, Clone, PartialEq)]
pub struct VkAccelerationStructureInstanceKHR {
pub transform: VkTransformMatrixKHR,
instance_id_mask: u32,
instance_offset_flags: u32,
pub accelerationStructureReference: u64,
}
impl_reprc!(
#[derive(Copy, PartialEq)]
pub struct VkAccelerationStructureInstanceKHR {
transform: VkTransformMatrixKHR,
#[assume_reprc]
instance_id_mask: u32,
#[assume_reprc]
instance_offset_flags: u32,
#[assume_reprc]
accelerationStructureReference: u64,
}
);
impl VkAccelerationStructureInstanceKHR {
pub fn new(

View file

@ -1,12 +1,12 @@
use safer_ffi::prelude::*;
use utilities::{impl_reprc, prelude::*};
#[derive_ReprC]
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct VkTransformMatrixKHR {
matrix: [[f32; 4]; 3],
}
impl_reprc!(
#[derive(Debug, Copy, PartialEq)]
pub struct VkTransformMatrixKHR {
#[assume_reprc]
matrix: [[f32; 4]; 3],
}
);
impl From<[[f32; 4]; 4]> for VkTransformMatrixKHR {
fn from(matrix: [[f32; 4]; 4]) -> Self {