#[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 ConfigStd140 {
pub current_view_proj_inv: [[f32; 4]; 4], pub previous_view_proj: [[f32; 4]; 4], pub jitter_amount: [f32; 2], pub has_history_data: u32, pub enable_side_by_side_debug_view: u32, pub history_weight: f32, pub history_weight_velocity_adjust_multiplier: f32, pub history_weight_velocity_adjust_max: f32, pub viewport_width: u32, pub viewport_height: u32, pub _padding0: [u8; 12], }
impl Default for ConfigStd140 {
fn default() -> Self {
ConfigStd140 {
current_view_proj_inv: <[[f32; 4]; 4]>::default(),
previous_view_proj: <[[f32; 4]; 4]>::default(),
jitter_amount: <[f32; 2]>::default(),
has_history_data: <u32>::default(),
enable_side_by_side_debug_view: <u32>::default(),
history_weight: <f32>::default(),
history_weight_velocity_adjust_multiplier: <f32>::default(),
history_weight_velocity_adjust_max: <f32>::default(),
viewport_width: <u32>::default(),
viewport_height: <u32>::default(),
_padding0: [u8::default(); 12],
}
}
}
pub type ConfigUniform = ConfigStd140;
pub const HISTORY_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const HISTORY_TEX_DESCRIPTOR_BINDING_INDEX: usize = 0;
pub const CURRENT_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const CURRENT_TEX_DESCRIPTOR_BINDING_INDEX: usize = 1;
pub const VELOCITY_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const VELOCITY_TEX_DESCRIPTOR_BINDING_INDEX: usize = 2;
pub const DEPTH_TEX_DESCRIPTOR_SET_INDEX: usize = 0;
pub const DEPTH_TEX_DESCRIPTOR_BINDING_INDEX: usize = 3;
pub const SMP_NEAREST_DESCRIPTOR_SET_INDEX: usize = 0;
pub const SMP_NEAREST_DESCRIPTOR_BINDING_INDEX: usize = 4;
pub const SMP_BILINEAR_DESCRIPTOR_SET_INDEX: usize = 0;
pub const SMP_BILINEAR_DESCRIPTOR_BINDING_INDEX: usize = 5;
pub const CONFIG_DESCRIPTOR_SET_INDEX: usize = 0;
pub const CONFIG_DESCRIPTOR_BINDING_INDEX: usize = 6;
pub struct DescriptorSet0Args<'a> {
pub history_tex: &'a ResourceArc<ImageViewResource>,
pub current_tex: &'a ResourceArc<ImageViewResource>,
pub velocity_tex: &'a ResourceArc<ImageViewResource>,
pub depth_tex: &'a ResourceArc<ImageViewResource>,
pub config: &'a ConfigUniform,
}
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_image(
HISTORY_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.history_tex,
);
descriptor_set.set_image(
CURRENT_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.current_tex,
);
descriptor_set.set_image(
VELOCITY_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.velocity_tex,
);
descriptor_set.set_image(DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32, args.depth_tex);
descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
}
}
pub struct DescriptorSet0(pub DynDescriptorSet);
impl DescriptorSet0 {
pub fn set_args_static(
descriptor_set: &mut DynDescriptorSet,
args: DescriptorSet0Args,
) {
descriptor_set.set_image(
HISTORY_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.history_tex,
);
descriptor_set.set_image(
CURRENT_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.current_tex,
);
descriptor_set.set_image(
VELOCITY_TEX_DESCRIPTOR_BINDING_INDEX as u32,
args.velocity_tex,
);
descriptor_set.set_image(DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32, args.depth_tex);
descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
}
pub fn set_args(
&mut self,
args: DescriptorSet0Args,
) {
self.set_history_tex(args.history_tex);
self.set_current_tex(args.current_tex);
self.set_velocity_tex(args.velocity_tex);
self.set_depth_tex(args.depth_tex);
self.set_config(args.config);
}
pub fn set_history_tex(
&mut self,
history_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(HISTORY_TEX_DESCRIPTOR_BINDING_INDEX as u32, history_tex);
}
pub fn set_current_tex(
&mut self,
current_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(CURRENT_TEX_DESCRIPTOR_BINDING_INDEX as u32, current_tex);
}
pub fn set_velocity_tex(
&mut self,
velocity_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(VELOCITY_TEX_DESCRIPTOR_BINDING_INDEX as u32, velocity_tex);
}
pub fn set_depth_tex(
&mut self,
depth_tex: &ResourceArc<ImageViewResource>,
) {
self.0
.set_image(DEPTH_TEX_DESCRIPTOR_BINDING_INDEX as u32, depth_tex);
}
pub fn set_config(
&mut self,
config: &ConfigUniform,
) {
self.0
.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, config);
}
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_config_std140() {
assert_eq!(std::mem::size_of::<ConfigStd140>(), 176);
assert_eq!(std::mem::size_of::<[[f32; 4]; 4]>(), 64);
assert_eq!(std::mem::align_of::<[[f32; 4]; 4]>(), 4);
assert_eq!(
memoffset::offset_of!(ConfigStd140, current_view_proj_inv),
0
);
assert_eq!(std::mem::size_of::<[[f32; 4]; 4]>(), 64);
assert_eq!(std::mem::align_of::<[[f32; 4]; 4]>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, previous_view_proj), 64);
assert_eq!(std::mem::size_of::<[f32; 2]>(), 8);
assert_eq!(std::mem::align_of::<[f32; 2]>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, jitter_amount), 128);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, has_history_data), 136);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(
memoffset::offset_of!(ConfigStd140, enable_side_by_side_debug_view),
140
);
assert_eq!(std::mem::size_of::<f32>(), 4);
assert_eq!(std::mem::align_of::<f32>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, history_weight), 144);
assert_eq!(std::mem::size_of::<f32>(), 4);
assert_eq!(std::mem::align_of::<f32>(), 4);
assert_eq!(
memoffset::offset_of!(ConfigStd140, history_weight_velocity_adjust_multiplier),
148
);
assert_eq!(std::mem::size_of::<f32>(), 4);
assert_eq!(std::mem::align_of::<f32>(), 4);
assert_eq!(
memoffset::offset_of!(ConfigStd140, history_weight_velocity_adjust_max),
152
);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, viewport_width), 156);
assert_eq!(std::mem::size_of::<u32>(), 4);
assert_eq!(std::mem::align_of::<u32>(), 4);
assert_eq!(memoffset::offset_of!(ConfigStd140, viewport_height), 160);
assert_eq!(std::mem::size_of::<[u8; 12]>(), 12);
assert_eq!(std::mem::align_of::<[u8; 12]>(), 1);
assert_eq!(memoffset::offset_of!(ConfigStd140, _padding0), 164);
}
}