#[allow(unused_imports)]
use rafx::RafxResult;
#[allow(unused_imports)]
use rafx::framework::{
DescriptorSetAllocator, DescriptorSetArc, DescriptorSetBindings, DescriptorSetInitializer,
DescriptorSetWriter, DescriptorSetWriterContext, DynDescriptorSet, ImageViewResource,
ResourceArc,
};
#[derive(Copy, Clone, Debug)]
#[repr(C)]
pub struct DepthPyramidConfigStd140 {
pub input_width: u32, pub input_height: u32, pub odd_width: u32, pub odd_height: u32, }
impl Default for DepthPyramidConfigStd140 {
fn default() -> Self {
DepthPyramidConfigStd140 {
input_width: <u32>::default(),
input_height: <u32>::default(),
odd_width: <u32>::default(),
odd_height: <u32>::default(),
}
}
}
pub type DepthPyramidConfigUniform = DepthPyramidConfigStd140;
pub const CONFIG_DESCRIPTOR_SET_INDEX: usize = 0;
pub const CONFIG_DESCRIPTOR_BINDING_INDEX: usize = 0;
pub const SRC_DEPTH_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const SRC_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX: usize = 1;
pub const SMP_DESCRIPTOR_SET_INDEX: usize = 0;
pub const SMP_DESCRIPTOR_BINDING_INDEX: usize = 2;
pub const DST_DEPTH_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const DST_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX: usize = 3;
pub struct DescriptorSet0Args<'a> {
pub config: &'a DepthPyramidConfigUniform,
pub src_depth_tex: &'a ResourceArc<ImageViewResource>,
pub dst_depth_tex: &'a ResourceArc<ImageViewResource>,
}
impl<'a> DescriptorSetInitializer<'a> for DescriptorSet0Args<'a> {
type Output = DescriptorSet0;
fn create_dyn_descriptor_set(
descriptor_set: DynDescriptorSet,
args: Self,
) -> Self::Output {
let mut descriptor = DescriptorSet0(descriptor_set);
descriptor.set_args(args);
descriptor
}
fn create_descriptor_set(
descriptor_set_allocator: &mut DescriptorSetAllocator,
descriptor_set: DynDescriptorSet,
args: Self,
) -> RafxResult<DescriptorSetArc> {
let mut descriptor = Self::create_dyn_descriptor_set(descriptor_set, args);
descriptor.0.flush(descriptor_set_allocator)?;
Ok(descriptor.0.descriptor_set().clone())
}
}
impl<'a> DescriptorSetWriter<'a> for DescriptorSet0Args<'a> {
fn write_to(
descriptor_set: &mut DescriptorSetWriterContext,
args: Self,
) {
descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
descriptor_set.set_image(
SRC_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.src_depth_tex,
);
descriptor_set.set_image(
DST_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.dst_depth_tex,
);
}
}
pub struct DescriptorSet0(pub DynDescriptorSet);
impl DescriptorSet0 {
pub fn set_args_static(
descriptor_set: &mut DynDescriptorSet,
args: DescriptorSet0Args,
) {
descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
descriptor_set.set_image(
SRC_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.src_depth_tex,
);
descriptor_set.set_image(
DST_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.dst_depth_tex,
);
}
pub fn set_args(
&mut self,
args: DescriptorSet0Args,
) {
self.set_config(args.config);
self.set_src_depth_tex(args.src_depth_tex);
self.set_dst_depth_tex(args.dst_depth_tex);
}
pub fn set_config(
&mut self,
config: &DepthPyramidConfigUniform,
) {
self.0
.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, config);
}
pub fn set_src_depth_tex(
&mut self,
src_depth_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(SRC_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32, src_depth_tex);
}
pub fn set_dst_depth_tex(
&mut self,
dst_depth_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(DST_DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32, dst_depth_tex);
}
pub fn flush(
&mut self,
descriptor_set_allocator: &mut DescriptorSetAllocator,
) -> RafxResult<()> {
self.0.flush(descriptor_set_allocator)
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_struct_depth_pyramid_config_std140() {
assert_eq!(std::mem::size_of::<DepthPyramidConfigStd140>(), 16);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(
memoffset::offset_of!(DepthPyramidConfigStd140, input_width),
0
);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(
memoffset::offset_of!(DepthPyramidConfigStd140, input_height),
4
);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(
memoffset::offset_of!(DepthPyramidConfigStd140, odd_width),
8
);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(
memoffset::offset_of!(DepthPyramidConfigStd140, odd_height),
12
);
}
}