pub struct InvTransformBuffer(/* private fields */);Expand description
An inverse transform uniform buffer for selection operations.
This buffer holds the inverse of the combined scale, rotation, and translation transform,
which is used for SelectionBundle::create_sphere_bundle
and SelectionBundle::create_box_bundle, but
can also be used for your custom selection operations.
Implementations§
Source§impl InvTransformBuffer
impl InvTransformBuffer
Sourcepub fn new(device: &Device) -> Self
pub fn new(device: &Device) -> Self
Create a new inverse transform buffer.
Examples found in repository?
examples/filter_selection.rs (line 149)
88async fn main() {
89 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
90
91 let args = Args::parse();
92 let model_path = &args.model;
93 let pos = Vec3::from_slice(&args.pos);
94 let rot = Quat::from_slice(&args.rot);
95 let scale = Vec3::from_slice(&args.scale);
96 let shape = match args.shape {
97 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
98 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
99 };
100 let repeat = args.repeat;
101 let offset = Vec3::from_slice(&args.offset);
102
103 log::debug!("Creating wgpu instance");
104 let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
105
106 log::debug!("Requesting adapter");
107 let adapter = instance
108 .request_adapter(&wgpu::RequestAdapterOptions::default())
109 .await
110 .expect("adapter");
111
112 log::debug!("Requesting device");
113 let (device, queue) = adapter
114 .request_device(&wgpu::DeviceDescriptor {
115 label: Some("Device"),
116 required_features: wgpu::Features::empty(),
117 required_limits: adapter.limits(),
118 memory_hints: wgpu::MemoryHints::default(),
119 trace: wgpu::Trace::Off,
120 })
121 .await
122 .expect("device");
123
124 log::debug!("Creating gaussians");
125 let f = std::fs::File::open(model_path).expect("ply file");
126 let mut reader = std::io::BufReader::new(f);
127 let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
128
129 log::debug!("Creating gaussians buffer");
130 let gaussians_buffer =
131 gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians.gaussians);
132
133 log::debug!("Creating model transform buffer");
134 let model_transform = gs::core::ModelTransformBuffer::new(&device);
135
136 log::debug!("Creating Gaussian transform buffer");
137 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
138
139 log::debug!("Creating shape selection compute bundle");
140 let shape_selection = shape(&device);
141
142 log::debug!("Creating selection bundle");
143 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
144
145 log::debug!("Creating shape selection buffers");
146 let shape_selection_buffers = (0..repeat)
147 .map(|i| {
148 let offset_pos = pos + offset * i as f32;
149 let buffer = gs::InvTransformBuffer::new(&device);
150 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
151 buffer
152 })
153 .collect::<Vec<_>>();
154
155 log::debug!("Creating shape selection bind groups");
156 let shape_selection_bind_groups = shape_selection_buffers
157 .iter()
158 .map(|buffer| {
159 selection_bundle.bundles[0]
160 .create_bind_group(
161 &device,
162 // index 0 is the Gaussians buffer, so we use 1,
163 // see docs of create_sphere_bundle or create_box_bundle
164 1,
165 [buffer.buffer().as_entire_binding()],
166 )
167 .expect("bind group")
168 })
169 .collect::<Vec<_>>();
170
171 log::debug!("Creating selection expression");
172 let selection_expr = shape_selection_bind_groups.into_iter().fold(
173 gs::SelectionExpr::Identity,
174 |acc, bind_group| {
175 acc.union(gs::SelectionExpr::selection(
176 0, // the 0 here is the bundle index in the selection bundle
177 vec![bind_group],
178 ))
179 },
180 );
181
182 log::debug!("Creating destination buffer");
183 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
184
185 log::info!("Starting selection process");
186 let time = std::time::Instant::now();
187
188 log::debug!("Selecting Gaussians");
189 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
190 label: Some("Selection Encoder"),
191 });
192
193 selection_bundle.evaluate(
194 &device,
195 &mut encoder,
196 &selection_expr,
197 &dest,
198 &model_transform,
199 &gaussian_transform,
200 &gaussians_buffer,
201 );
202
203 queue.submit(Some(encoder.finish()));
204
205 #[allow(unused_must_use)]
206 device.poll(wgpu::PollType::Wait);
207
208 log::info!("Editing process completed in {:?}", time.elapsed());
209
210 log::debug!("Filtering Gaussians");
211 let selected_gaussians = gs::core::Gaussians {
212 gaussians: dest
213 .download::<u32>(&device, &queue)
214 .await
215 .expect("selected download")
216 .iter()
217 .flat_map(|group| {
218 std::iter::repeat_n(group, 32)
219 .enumerate()
220 .map(|(i, g)| g & (1 << i) != 0)
221 })
222 .zip(gaussians.gaussians.iter())
223 .filter(|(selected, _)| *selected)
224 .map(|(_, g)| g.clone())
225 .collect::<Vec<_>>(),
226 };
227
228 log::debug!("Writing modified Gaussians to output file");
229 let output_file = std::fs::File::create(&args.output).expect("output file");
230 let mut writer = std::io::BufWriter::new(output_file);
231 selected_gaussians
232 .write_ply(&mut writer)
233 .expect("write modified Gaussians to output file");
234
235 log::info!("Filtered Gaussians written to {}", args.output);
236}More examples
examples/modify_selection.rs (line 211)
125async fn main() {
126 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
127
128 let args = Args::parse();
129 let model_path = &args.model;
130 let pos = Vec3::from_slice(&args.pos);
131 let rot = Quat::from_slice(&args.rot);
132 let scale = Vec3::from_slice(&args.scale);
133 let shape = match args.shape {
134 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
135 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
136 };
137 let repeat = args.repeat;
138 let offset = Vec3::from_slice(&args.offset);
139
140 log::debug!("Creating wgpu instance");
141 let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
142
143 log::debug!("Requesting adapter");
144 let adapter = instance
145 .request_adapter(&wgpu::RequestAdapterOptions::default())
146 .await
147 .expect("adapter");
148
149 log::debug!("Requesting device");
150 let (device, queue) = adapter
151 .request_device(&wgpu::DeviceDescriptor {
152 label: Some("Device"),
153 required_features: wgpu::Features::empty(),
154 required_limits: adapter.limits(),
155 memory_hints: wgpu::MemoryHints::default(),
156 trace: wgpu::Trace::Off,
157 })
158 .await
159 .expect("device");
160
161 log::debug!("Creating gaussians");
162 let f = std::fs::File::open(model_path).expect("ply file");
163 let mut reader = std::io::BufReader::new(f);
164 let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
165
166 log::debug!("Creating editor");
167 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
168
169 log::debug!("Creating shape selection compute bundle");
170 let shape_selection = shape(&device);
171
172 log::debug!("Creating basic selection modifier");
173 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
174 &device,
175 &editor.gaussians_buffer,
176 &editor.model_transform_buffer,
177 &editor.gaussian_transform_buffer,
178 vec![shape_selection],
179 );
180
181 log::debug!("Configuring modifiers");
182 match args.override_rgb {
183 true => basic_selection_modifier
184 .modifier
185 .basic_color_modifiers_buffer
186 .update_with_override_rgb(
187 &queue,
188 Vec3::from_slice(&args.rgb_or_hsv),
189 args.alpha,
190 args.contrast,
191 args.exposure,
192 args.gamma,
193 ),
194 false => basic_selection_modifier
195 .modifier
196 .basic_color_modifiers_buffer
197 .update_with_hsv_modifiers(
198 &queue,
199 Vec3::from_slice(&args.rgb_or_hsv),
200 args.alpha,
201 args.contrast,
202 args.exposure,
203 args.gamma,
204 ),
205 }
206
207 log::debug!("Creating shape selection buffers");
208 let shape_selection_buffers = (0..repeat)
209 .map(|i| {
210 let offset_pos = pos + offset * i as f32;
211 let buffer = gs::InvTransformBuffer::new(&device);
212 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
213 buffer
214 })
215 .collect::<Vec<_>>();
216
217 log::debug!("Creating shape selection bind groups");
218 let shape_selection_bind_groups = shape_selection_buffers
219 .iter()
220 .map(|buffer| {
221 basic_selection_modifier.selection.bundles[0]
222 .create_bind_group(
223 &device,
224 // index 0 is the Gaussians buffer, so we use 1,
225 // see docs of create_sphere_bundle or create_box_bundle
226 1,
227 [buffer.buffer().as_entire_binding()],
228 )
229 .expect("bind group")
230 })
231 .collect::<Vec<_>>();
232
233 log::debug!("Creating selection expression");
234 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
235 gs::SelectionExpr::Identity,
236 |acc, bind_group| {
237 acc.union(gs::SelectionExpr::selection(
238 0, // the 0 here is the bundle index in the selection bundle
239 vec![bind_group],
240 ))
241 },
242 );
243
244 log::info!("Starting editing process");
245 let time = std::time::Instant::now();
246
247 log::debug!("Editing Gaussians");
248 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
249 label: Some("Edit Encoder"),
250 });
251
252 editor.apply(
253 &device,
254 &mut encoder,
255 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
256 );
257
258 queue.submit(Some(encoder.finish()));
259
260 #[allow(unused_must_use)]
261 device.poll(wgpu::PollType::Wait);
262
263 log::info!("Editing process completed in {:?}", time.elapsed());
264
265 log::debug!("Downloading Gaussians");
266 let modified_gaussians = gs::core::Gaussians {
267 gaussians: editor
268 .gaussians_buffer
269 .download_gaussians(&device, &queue)
270 .await
271 .expect("gaussians download"),
272 };
273
274 log::debug!("Writing modified Gaussians to output file");
275 let output_file = std::fs::File::create(&args.output).expect("output file");
276 let mut writer = std::io::BufWriter::new(output_file);
277 modified_gaussians
278 .write_ply(&mut writer)
279 .expect("write modified Gaussians to output file");
280
281 log::info!("Modified Gaussians written to {}", args.output);
282}Sourcepub fn update_with_scale_rot_pos(
&self,
queue: &Queue,
scale: Vec3,
rot: Quat,
pos: Vec3,
)
pub fn update_with_scale_rot_pos( &self, queue: &Queue, scale: Vec3, rot: Quat, pos: Vec3, )
Update the sphere selection buffer with the scale, rotation, and position.
Examples found in repository?
examples/filter_selection.rs (line 150)
88async fn main() {
89 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
90
91 let args = Args::parse();
92 let model_path = &args.model;
93 let pos = Vec3::from_slice(&args.pos);
94 let rot = Quat::from_slice(&args.rot);
95 let scale = Vec3::from_slice(&args.scale);
96 let shape = match args.shape {
97 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
98 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
99 };
100 let repeat = args.repeat;
101 let offset = Vec3::from_slice(&args.offset);
102
103 log::debug!("Creating wgpu instance");
104 let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
105
106 log::debug!("Requesting adapter");
107 let adapter = instance
108 .request_adapter(&wgpu::RequestAdapterOptions::default())
109 .await
110 .expect("adapter");
111
112 log::debug!("Requesting device");
113 let (device, queue) = adapter
114 .request_device(&wgpu::DeviceDescriptor {
115 label: Some("Device"),
116 required_features: wgpu::Features::empty(),
117 required_limits: adapter.limits(),
118 memory_hints: wgpu::MemoryHints::default(),
119 trace: wgpu::Trace::Off,
120 })
121 .await
122 .expect("device");
123
124 log::debug!("Creating gaussians");
125 let f = std::fs::File::open(model_path).expect("ply file");
126 let mut reader = std::io::BufReader::new(f);
127 let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
128
129 log::debug!("Creating gaussians buffer");
130 let gaussians_buffer =
131 gs::core::GaussiansBuffer::<GaussianPod>::new(&device, &gaussians.gaussians);
132
133 log::debug!("Creating model transform buffer");
134 let model_transform = gs::core::ModelTransformBuffer::new(&device);
135
136 log::debug!("Creating Gaussian transform buffer");
137 let gaussian_transform = gs::core::GaussianTransformBuffer::new(&device);
138
139 log::debug!("Creating shape selection compute bundle");
140 let shape_selection = shape(&device);
141
142 log::debug!("Creating selection bundle");
143 let selection_bundle = gs::SelectionBundle::<GaussianPod>::new(&device, vec![shape_selection]);
144
145 log::debug!("Creating shape selection buffers");
146 let shape_selection_buffers = (0..repeat)
147 .map(|i| {
148 let offset_pos = pos + offset * i as f32;
149 let buffer = gs::InvTransformBuffer::new(&device);
150 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
151 buffer
152 })
153 .collect::<Vec<_>>();
154
155 log::debug!("Creating shape selection bind groups");
156 let shape_selection_bind_groups = shape_selection_buffers
157 .iter()
158 .map(|buffer| {
159 selection_bundle.bundles[0]
160 .create_bind_group(
161 &device,
162 // index 0 is the Gaussians buffer, so we use 1,
163 // see docs of create_sphere_bundle or create_box_bundle
164 1,
165 [buffer.buffer().as_entire_binding()],
166 )
167 .expect("bind group")
168 })
169 .collect::<Vec<_>>();
170
171 log::debug!("Creating selection expression");
172 let selection_expr = shape_selection_bind_groups.into_iter().fold(
173 gs::SelectionExpr::Identity,
174 |acc, bind_group| {
175 acc.union(gs::SelectionExpr::selection(
176 0, // the 0 here is the bundle index in the selection bundle
177 vec![bind_group],
178 ))
179 },
180 );
181
182 log::debug!("Creating destination buffer");
183 let dest = gs::SelectionBuffer::new(&device, gaussians_buffer.len() as u32);
184
185 log::info!("Starting selection process");
186 let time = std::time::Instant::now();
187
188 log::debug!("Selecting Gaussians");
189 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
190 label: Some("Selection Encoder"),
191 });
192
193 selection_bundle.evaluate(
194 &device,
195 &mut encoder,
196 &selection_expr,
197 &dest,
198 &model_transform,
199 &gaussian_transform,
200 &gaussians_buffer,
201 );
202
203 queue.submit(Some(encoder.finish()));
204
205 #[allow(unused_must_use)]
206 device.poll(wgpu::PollType::Wait);
207
208 log::info!("Editing process completed in {:?}", time.elapsed());
209
210 log::debug!("Filtering Gaussians");
211 let selected_gaussians = gs::core::Gaussians {
212 gaussians: dest
213 .download::<u32>(&device, &queue)
214 .await
215 .expect("selected download")
216 .iter()
217 .flat_map(|group| {
218 std::iter::repeat_n(group, 32)
219 .enumerate()
220 .map(|(i, g)| g & (1 << i) != 0)
221 })
222 .zip(gaussians.gaussians.iter())
223 .filter(|(selected, _)| *selected)
224 .map(|(_, g)| g.clone())
225 .collect::<Vec<_>>(),
226 };
227
228 log::debug!("Writing modified Gaussians to output file");
229 let output_file = std::fs::File::create(&args.output).expect("output file");
230 let mut writer = std::io::BufWriter::new(output_file);
231 selected_gaussians
232 .write_ply(&mut writer)
233 .expect("write modified Gaussians to output file");
234
235 log::info!("Filtered Gaussians written to {}", args.output);
236}More examples
examples/modify_selection.rs (line 212)
125async fn main() {
126 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
127
128 let args = Args::parse();
129 let model_path = &args.model;
130 let pos = Vec3::from_slice(&args.pos);
131 let rot = Quat::from_slice(&args.rot);
132 let scale = Vec3::from_slice(&args.scale);
133 let shape = match args.shape {
134 Shape::Sphere => gs::SelectionBundle::<GaussianPod>::create_sphere_bundle,
135 Shape::Box => gs::SelectionBundle::<GaussianPod>::create_box_bundle,
136 };
137 let repeat = args.repeat;
138 let offset = Vec3::from_slice(&args.offset);
139
140 log::debug!("Creating wgpu instance");
141 let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
142
143 log::debug!("Requesting adapter");
144 let adapter = instance
145 .request_adapter(&wgpu::RequestAdapterOptions::default())
146 .await
147 .expect("adapter");
148
149 log::debug!("Requesting device");
150 let (device, queue) = adapter
151 .request_device(&wgpu::DeviceDescriptor {
152 label: Some("Device"),
153 required_features: wgpu::Features::empty(),
154 required_limits: adapter.limits(),
155 memory_hints: wgpu::MemoryHints::default(),
156 trace: wgpu::Trace::Off,
157 })
158 .await
159 .expect("device");
160
161 log::debug!("Creating gaussians");
162 let f = std::fs::File::open(model_path).expect("ply file");
163 let mut reader = std::io::BufReader::new(f);
164 let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");
165
166 log::debug!("Creating editor");
167 let editor = gs::Editor::<GaussianPod>::new(&device, &gaussians);
168
169 log::debug!("Creating shape selection compute bundle");
170 let shape_selection = shape(&device);
171
172 log::debug!("Creating basic selection modifier");
173 let mut basic_selection_modifier = gs::SelectionModifier::new_with_basic_modifier(
174 &device,
175 &editor.gaussians_buffer,
176 &editor.model_transform_buffer,
177 &editor.gaussian_transform_buffer,
178 vec![shape_selection],
179 );
180
181 log::debug!("Configuring modifiers");
182 match args.override_rgb {
183 true => basic_selection_modifier
184 .modifier
185 .basic_color_modifiers_buffer
186 .update_with_override_rgb(
187 &queue,
188 Vec3::from_slice(&args.rgb_or_hsv),
189 args.alpha,
190 args.contrast,
191 args.exposure,
192 args.gamma,
193 ),
194 false => basic_selection_modifier
195 .modifier
196 .basic_color_modifiers_buffer
197 .update_with_hsv_modifiers(
198 &queue,
199 Vec3::from_slice(&args.rgb_or_hsv),
200 args.alpha,
201 args.contrast,
202 args.exposure,
203 args.gamma,
204 ),
205 }
206
207 log::debug!("Creating shape selection buffers");
208 let shape_selection_buffers = (0..repeat)
209 .map(|i| {
210 let offset_pos = pos + offset * i as f32;
211 let buffer = gs::InvTransformBuffer::new(&device);
212 buffer.update_with_scale_rot_pos(&queue, scale, rot, offset_pos);
213 buffer
214 })
215 .collect::<Vec<_>>();
216
217 log::debug!("Creating shape selection bind groups");
218 let shape_selection_bind_groups = shape_selection_buffers
219 .iter()
220 .map(|buffer| {
221 basic_selection_modifier.selection.bundles[0]
222 .create_bind_group(
223 &device,
224 // index 0 is the Gaussians buffer, so we use 1,
225 // see docs of create_sphere_bundle or create_box_bundle
226 1,
227 [buffer.buffer().as_entire_binding()],
228 )
229 .expect("bind group")
230 })
231 .collect::<Vec<_>>();
232
233 log::debug!("Creating selection expression");
234 basic_selection_modifier.selection_expr = shape_selection_bind_groups.into_iter().fold(
235 gs::SelectionExpr::Identity,
236 |acc, bind_group| {
237 acc.union(gs::SelectionExpr::selection(
238 0, // the 0 here is the bundle index in the selection bundle
239 vec![bind_group],
240 ))
241 },
242 );
243
244 log::info!("Starting editing process");
245 let time = std::time::Instant::now();
246
247 log::debug!("Editing Gaussians");
248 let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
249 label: Some("Edit Encoder"),
250 });
251
252 editor.apply(
253 &device,
254 &mut encoder,
255 [&basic_selection_modifier as &dyn gs::Modifier<GaussianPod>],
256 );
257
258 queue.submit(Some(encoder.finish()));
259
260 #[allow(unused_must_use)]
261 device.poll(wgpu::PollType::Wait);
262
263 log::info!("Editing process completed in {:?}", time.elapsed());
264
265 log::debug!("Downloading Gaussians");
266 let modified_gaussians = gs::core::Gaussians {
267 gaussians: editor
268 .gaussians_buffer
269 .download_gaussians(&device, &queue)
270 .await
271 .expect("gaussians download"),
272 };
273
274 log::debug!("Writing modified Gaussians to output file");
275 let output_file = std::fs::File::create(&args.output).expect("output file");
276 let mut writer = std::io::BufWriter::new(output_file);
277 modified_gaussians
278 .write_ply(&mut writer)
279 .expect("write modified Gaussians to output file");
280
281 log::info!("Modified Gaussians written to {}", args.output);
282}Trait Implementations§
Source§impl BufferWrapper for InvTransformBuffer
impl BufferWrapper for InvTransformBuffer
Source§const DEFAULT_USAGES: BufferUsages = _
const DEFAULT_USAGES: BufferUsages = _
The default usages.
Source§impl Clone for InvTransformBuffer
impl Clone for InvTransformBuffer
Source§fn clone(&self) -> InvTransformBuffer
fn clone(&self) -> InvTransformBuffer
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for InvTransformBuffer
impl Debug for InvTransformBuffer
Source§impl From<InvTransformBuffer> for Buffer
impl From<InvTransformBuffer> for Buffer
Source§fn from(wrapper: InvTransformBuffer) -> Self
fn from(wrapper: InvTransformBuffer) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl Freeze for InvTransformBuffer
impl !RefUnwindSafe for InvTransformBuffer
impl Send for InvTransformBuffer
impl Sync for InvTransformBuffer
impl Unpin for InvTransformBuffer
impl !UnwindSafe for InvTransformBuffer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DownloadableBufferWrapper for T
impl<T> DownloadableBufferWrapper for T
Source§fn download<T>(
&self,
device: &Device,
queue: &Queue,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
fn download<T>(
&self,
device: &Device,
queue: &Queue,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
Download the buffer data.
Source§fn prepare_download(
&self,
device: &Device,
encoder: &mut CommandEncoder,
) -> Buffer
fn prepare_download( &self, device: &Device, encoder: &mut CommandEncoder, ) -> Buffer
Prepare for downloading the buffer data. Read more
Source§fn map_download<T>(
download: &Buffer,
device: &Device,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
fn map_download<T>(
download: &Buffer,
device: &Device,
) -> impl Future<Output = Result<Vec<T>, DownloadBufferError>> + Sendwhere
T: NoUninit + AnyBitPattern,
Map the download buffer to read the buffer data. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more