use crate::context::Context;
use crate::{Error, GpuProfile};
use super::core::RadixSorter;
use super::pipeline::SortItemKind;
pub struct Sorter {
core: RadixSorter,
}
impl Sorter {
pub fn new(device: &wgpu::Device, queue: &wgpu::Queue) -> Self {
Self {
core: RadixSorter::new(device, queue, SortItemKind::Key),
}
}
pub fn from_context(ctx: &Context) -> Self {
Self::new(&ctx.device, &ctx.queue)
}
pub async fn sort(&mut self, input: &[u32]) -> Result<Vec<u32>, Error> {
self.core.sort_slice(input).await
}
pub fn sort_gpu_to_gpu(
&mut self,
input: &wgpu::Buffer,
output: &wgpu::Buffer,
num_items: u32,
) -> Result<(), Error> {
self.core.sort_gpu_to_gpu(input, output, num_items)
}
pub async fn profile_sort_gpu_to_gpu(
&mut self,
input: &wgpu::Buffer,
output: &wgpu::Buffer,
num_items: u32,
) -> Result<GpuProfile, Error> {
self.core
.profile_sort_gpu_to_gpu(input, output, num_items)
.await
}
pub fn record_sort(
&mut self,
encoder: &mut wgpu::CommandEncoder,
input: &wgpu::Buffer,
output: &wgpu::Buffer,
num_items: u32,
) -> Result<(), Error> {
self.core.record_sort(encoder, input, output, num_items)
}
}