vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
use super::{
    emit_atomic_helpers, emit_storage_load_helper, emit_storage_store_helper, wgsl_element_type,
    wgsl_zero_value,
};
use crate::ir::model::program::BufferDecl;
use crate::ir::model::types::BufferAccess;
use crate::lower::wgsl::helper_usage::BufferHelperUsageView;
use crate::lower::wgsl::Error;
use std::fmt::Write as _;

#[inline]
pub(crate) fn emit_buffer_access_helpers(
    out: &mut String,
    buf: &BufferDecl,
    usage: BufferHelperUsageView<'_>,
) -> Result<(), Error> {
    let ty = wgsl_element_type(buf.element.clone())?;
    let zero = wgsl_zero_value(buf.element.clone())?;
    if buf.access != BufferAccess::Workgroup {
        if usage.load {
            emit_storage_load_helper(out, buf, ty, zero, usage.uses_atomics());
        }
        if buf.access == BufferAccess::ReadWrite {
            if usage.store {
                emit_storage_store_helper(out, buf, ty, usage.uses_atomics());
            }
            if let Some(atomic_ops) = usage.atomic_ops {
                emit_atomic_helpers(out, &buf.name, atomic_ops)?;
            }
        }
        return Ok(());
    }
    if !usage.load {
        return Ok(());
    }
    let _ = write!(
        out,
        "fn _vyre_load_{name}(idx: u32) -> {ty} {{\n\
         if (idx < {count}u) {{\n\
           return {name}[idx];\n\
         }}\n\
         return {zero};\n\
       }}\n\n",
        name = buf.name,
        count = buf.count,
    );
    Ok(())
}