use std::{
collections::HashMap,
sync::{Arc, Mutex},
};
use crate::{driver::Driver, error::CudaError, memory::PinnedUploadStagingPool};
use super::host_budget::SharedCudaHostBudget;
use super::{inner::ContextInner, ContextResourceLifecycle, CudaContext};
impl CudaContext {
pub fn system_default() -> Result<Self, CudaError> {
let driver = Driver::load()?;
driver.check("cuInit", unsafe { (driver.cu_init)(0) })?;
let mut count = 0;
driver.check("cuDeviceGetCount", unsafe {
(driver.cu_device_get_count)(&raw mut count)
})?;
if count <= 0 {
return Err(CudaError::Unavailable {
message: "no CUDA devices reported by driver".to_string(),
});
}
let mut device = 0;
driver.check("cuDeviceGet", unsafe {
(driver.cu_device_get)(&raw mut device, 0)
})?;
let mut context = std::ptr::null_mut();
driver.check("cuCtxCreate_v2", unsafe {
(driver.cu_ctx_create)(&raw mut context, 0, device)
})?;
super::validate_resource_handle(
context,
"CUDA returned a null context after successful creation",
)?;
Ok(Self {
inner: Arc::new(ContextInner {
driver,
context,
modules: Mutex::new(HashMap::new()),
pinned_upload_operation: Mutex::new(()),
pinned_upload_staging: Mutex::new(PinnedUploadStagingPool::new()),
host_budget: SharedCudaHostBudget::new(),
resource_lifecycle: ContextResourceLifecycle::new(),
}),
})
}
}