rafx_framework/shaders/
util_fill_buffer_comp.rs1#[allow(unused_imports)]
4use rafx_api::RafxResult;
5
6#[allow(unused_imports)]
7use crate::{
8 DescriptorSetAllocator, DescriptorSetArc, DescriptorSetBindings, DescriptorSetInitializer,
9 DescriptorSetWriter, DescriptorSetWriterContext, DynDescriptorSet, ImageViewResource,
10 ResourceArc,
11};
12
13#[derive(Copy, Clone, Debug)]
14#[repr(C)]
15pub struct ClearBufferConfigStd140 {
16 pub buffer_bytes_div_by_four: u32, pub fill_value: u32, pub num_workgroups_x: u32, pub _padding0: [u8; 4], } impl Default for ClearBufferConfigStd140 {
23 fn default() -> Self {
24 ClearBufferConfigStd140 {
25 buffer_bytes_div_by_four: <u32>::default(),
26 fill_value: <u32>::default(),
27 num_workgroups_x: <u32>::default(),
28 _padding0: [u8::default(); 4],
29 }
30 }
31}
32
33pub type ClearBufferConfigUniform = ClearBufferConfigStd140;
34
35pub const CONFIG_DESCRIPTOR_SET_INDEX: usize = 0;
36pub const CONFIG_DESCRIPTOR_BINDING_INDEX: usize = 0;
37pub const DATA_DESCRIPTOR_SET_INDEX: usize = 0;
38pub const DATA_DESCRIPTOR_BINDING_INDEX: usize = 1;
39
40pub struct DescriptorSet0Args<'a> {
41 pub config: &'a ClearBufferConfigUniform,
42}
43
44impl<'a> DescriptorSetInitializer<'a> for DescriptorSet0Args<'a> {
45 type Output = DescriptorSet0;
46
47 fn create_dyn_descriptor_set(
48 descriptor_set: DynDescriptorSet,
49 args: Self,
50 ) -> Self::Output {
51 let mut descriptor = DescriptorSet0(descriptor_set);
52 descriptor.set_args(args);
53 descriptor
54 }
55
56 fn create_descriptor_set(
57 descriptor_set_allocator: &mut DescriptorSetAllocator,
58 descriptor_set: DynDescriptorSet,
59 args: Self,
60 ) -> RafxResult<DescriptorSetArc> {
61 let mut descriptor = Self::create_dyn_descriptor_set(descriptor_set, args);
62 descriptor.0.flush(descriptor_set_allocator)?;
63 Ok(descriptor.0.descriptor_set().clone())
64 }
65}
66
67impl<'a> DescriptorSetWriter<'a> for DescriptorSet0Args<'a> {
68 fn write_to(
69 descriptor_set: &mut DescriptorSetWriterContext,
70 args: Self,
71 ) {
72 descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
73 }
74}
75
76pub struct DescriptorSet0(pub DynDescriptorSet);
77
78impl DescriptorSet0 {
79 pub fn set_args_static(
80 descriptor_set: &mut DynDescriptorSet,
81 args: DescriptorSet0Args,
82 ) {
83 descriptor_set.set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, args.config);
84 }
85
86 pub fn set_args(
87 &mut self,
88 args: DescriptorSet0Args,
89 ) {
90 self.set_config(args.config);
91 }
92
93 pub fn set_config(
94 &mut self,
95 config: &ClearBufferConfigUniform,
96 ) {
97 self.0
98 .set_buffer_data(CONFIG_DESCRIPTOR_BINDING_INDEX as u32, config);
99 }
100
101 pub fn flush(
102 &mut self,
103 descriptor_set_allocator: &mut DescriptorSetAllocator,
104 ) -> RafxResult<()> {
105 self.0.flush(descriptor_set_allocator)
106 }
107}
108
109#[cfg(test)]
110mod test {
111 use super::*;
112
113 #[test]
114 fn test_struct_clear_buffer_config_std140() {
115 assert_eq!(std::mem::size_of::<ClearBufferConfigStd140>(), 16);
116 assert_eq!(std::mem::size_of::<u32>(), 4);
117 assert_eq!(std::mem::align_of::<u32>(), 4);
118 assert_eq!(
119 memoffset::offset_of!(ClearBufferConfigStd140, buffer_bytes_div_by_four),
120 0
121 );
122 assert_eq!(std::mem::size_of::<u32>(), 4);
123 assert_eq!(std::mem::align_of::<u32>(), 4);
124 assert_eq!(
125 memoffset::offset_of!(ClearBufferConfigStd140, fill_value),
126 4
127 );
128 assert_eq!(std::mem::size_of::<u32>(), 4);
129 assert_eq!(std::mem::align_of::<u32>(), 4);
130 assert_eq!(
131 memoffset::offset_of!(ClearBufferConfigStd140, num_workgroups_x),
132 8
133 );
134 assert_eq!(std::mem::size_of::<[u8; 4]>(), 4);
135 assert_eq!(std::mem::align_of::<[u8; 4]>(), 1);
136 assert_eq!(
137 memoffset::offset_of!(ClearBufferConfigStd140, _padding0),
138 12
139 );
140 }
141}