vyre-wgpu 0.1.0

wgpu backend for vyre IR — implements VyreBackend, owns GPU runtime, buffer pool, pipeline cache
Documentation
//! Reusable per-device DFA scan resources.
//!
//! [`ScanResources`] pre-allocates the input, match, params, and
//! readback buffers once per compiled device and amortises buffer
//! setup across repeated scans of bounded input sizes. Callers
//! scanning many inputs against one DFA keep a single instance
//! and feed it fresh bytes; callers with unbounded sizes use the
//! one-shot `scan` path instead.

use crate::engine::dfa::buffers::{buffer, match_buffer_size};
use crate::engine::dfa::input::DfaParams;
use vyre::error::{Error, Result};

/// Reusable buffers for repeated DFA scans on one compiled GPU device.
#[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,
        })
    }
}