mod pool;
pub mod resident;
pub use pool::{AllocationInfo, MemoryPool, PoolConfig};
use crate::driver::DevicePtr;
use crate::error::Result;
#[derive(Debug)]
pub struct GpuBuffer<T> {
ptr: DevicePtr<T>,
len: usize,
capacity: usize,
}
impl<T> GpuBuffer<T> {
#[must_use]
pub fn new(len: usize) -> Self {
Self { ptr: DevicePtr::null(), len, capacity: len }
}
#[must_use]
pub const fn len(&self) -> usize {
self.len
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.len == 0
}
#[must_use]
pub const fn as_ptr(&self) -> DevicePtr<T> {
self.ptr
}
#[must_use]
pub const fn size_bytes(&self) -> usize {
self.len * std::mem::size_of::<T>()
}
}
pub fn copy_h2d<T: Copy>(_dst: &mut GpuBuffer<T>, _src: &[T]) -> Result<()> {
Ok(())
}
pub fn copy_d2h<T: Copy>(_src: &GpuBuffer<T>, _dst: &mut [T]) -> Result<()> {
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gpu_buffer_creation() {
let buffer: GpuBuffer<f32> = GpuBuffer::new(1024);
assert_eq!(buffer.len(), 1024);
assert_eq!(buffer.size_bytes(), 1024 * 4);
assert!(!buffer.is_empty());
}
#[test]
fn test_gpu_buffer_empty() {
let buffer: GpuBuffer<f32> = GpuBuffer::new(0);
assert!(buffer.is_empty());
}
#[test]
fn test_gpu_buffer_as_ptr() {
let buffer: GpuBuffer<f32> = GpuBuffer::new(100);
let ptr = buffer.as_ptr();
assert!(ptr.is_null()); }
#[test]
fn test_copy_h2d_d2h() {
let mut buffer: GpuBuffer<f32> = GpuBuffer::new(4);
let src = [1.0f32, 2.0, 3.0, 4.0];
assert!(copy_h2d(&mut buffer, &src).is_ok());
let mut dst = [0.0f32; 4];
assert!(copy_d2h(&buffer, &mut dst).is_ok());
}
#[test]
fn test_gpu_buffer_different_types() {
let buffer_f64: GpuBuffer<f64> = GpuBuffer::new(512);
assert_eq!(buffer_f64.size_bytes(), 512 * 8);
let buffer_u8: GpuBuffer<u8> = GpuBuffer::new(1024);
assert_eq!(buffer_u8.size_bytes(), 1024);
}
}