memkit-gpu 0.2.0-beta.1

Backend-agnostic GPU memory management for memkit
//! Staging buffer for CPU-GPU transfers.

use crate::backend::MkGpuBackend;

/// A staging buffer for CPU-GPU data transfers.
pub struct MkStagingBuffer<B: MkGpuBackend> {
    handle: B::BufferHandle,
    size: usize,
}

impl<B: MkGpuBackend> MkStagingBuffer<B> {
    /// Create a new staging buffer.
    pub(crate) fn new(handle: B::BufferHandle, size: usize) -> Self {
        Self { handle, size }
    }

    /// Get the buffer size in bytes.
    pub fn size(&self) -> usize {
        self.size
    }
    
    /// Get the native buffer handle.
    pub fn handle(&self) -> &B::BufferHandle {
        &self.handle
    }
}

/// Errors that can occur with staging buffers.
#[derive(Debug)]
pub enum StagingError {
    DataTooLarge,
    NotMapped,
    MapFailed,
}

impl std::fmt::Display for StagingError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            StagingError::DataTooLarge => write!(f, "Data too large for staging buffer"),
            StagingError::NotMapped => write!(f, "Buffer not mapped"),
            StagingError::MapFailed => write!(f, "Failed to map buffer"),
        }
    }
}

impl std::error::Error for StagingError {}