use crate::engine::dfa::buffers::{buffer, match_buffer_size};
use crate::engine::dfa::input::DfaParams;
use vyre::error::{Error, Result};
#[non_exhaustive]
pub struct ScanResources {
pub(super) input_buffer: wgpu::Buffer,
pub(super) match_buffer: wgpu::Buffer,
pub(super) match_count_buffer: wgpu::Buffer,
pub(super) params_buffer: wgpu::Buffer,
pub(super) count_readback: wgpu::Buffer,
pub(super) match_readback: wgpu::Buffer,
pub(super) max_input_len: u32,
}
impl ScanResources {
pub(super) fn new(device: &wgpu::Device, max_input_len: u32, max_matches: u32) -> Result<Self> {
let input_bytes = u64::from(max_input_len.div_ceil(4).max(1)) * 4;
let match_bytes = match_buffer_size(max_matches)?;
Ok(Self {
input_buffer: buffer(
device,
"vyre dfa input",
input_bytes,
wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
),
match_buffer: buffer(
device,
"vyre dfa matches",
match_bytes,
wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC,
),
match_count_buffer: buffer(
device,
"vyre dfa match count",
4,
wgpu::BufferUsages::STORAGE
| wgpu::BufferUsages::COPY_SRC
| wgpu::BufferUsages::COPY_DST,
),
params_buffer: buffer(
device,
"vyre dfa params",
u64::try_from(std::mem::size_of::<DfaParams>()).map_err(|source| Error::Dfa {
message: format!(
"DfaParams size cannot fit u64: {source}. Fix: run on a supported target."
),
})?,
wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
),
count_readback: buffer(
device,
"vyre dfa count readback",
4,
wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
),
match_readback: buffer(
device,
"vyre dfa match readback",
match_bytes,
wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
),
max_input_len,
})
}
}