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(())
}