use std::any::Any;
use std::fmt;
use crate::error::DeviceCreationError;
use crate::queue::{Capability, QueueGroup};
use crate::{format, image, memory, Backend, Features, Gpu, Limits};
pub type QueuePriority = f32;
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MemoryTypeId(pub usize);
impl From<usize> for MemoryTypeId {
fn from(id: usize) -> Self {
MemoryTypeId(id)
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MemoryType {
pub properties: memory::Properties,
pub heap_index: usize,
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MemoryProperties {
pub memory_types: Vec<MemoryType>,
pub memory_heaps: Vec<u64>,
}
pub trait PhysicalDevice<B: Backend>: fmt::Debug + Any + Send + Sync {
unsafe fn open(
&self,
families: &[(&B::QueueFamily, &[QueuePriority])],
requested_features: Features,
) -> Result<Gpu<B>, DeviceCreationError>;
fn format_properties(&self, format: Option<format::Format>) -> format::Properties;
fn image_format_properties(
&self,
format: format::Format,
dimensions: u8,
tiling: image::Tiling,
usage: image::Usage,
view_caps: image::ViewCapabilities,
) -> Option<image::FormatProperties>;
fn memory_properties(&self) -> MemoryProperties;
fn features(&self) -> Features;
fn limits(&self) -> Limits;
fn is_valid_cache(&self, _cache: &[u8]) -> bool {
false
}
}
#[derive(Clone, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum DeviceType {
Other = 0,
IntegratedGpu = 1,
DiscreteGpu = 2,
VirtualGpu = 3,
Cpu = 4,
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct AdapterInfo {
pub name: String,
pub vendor: usize,
pub device: usize,
pub device_type: DeviceType,
}
pub struct Adapter<B: Backend> {
pub info: AdapterInfo,
pub physical_device: B::PhysicalDevice,
pub queue_families: Vec<B::QueueFamily>,
}
impl<B: Backend> Adapter<B> {
pub fn open_with<F, C>(
&self,
count: usize,
selector: F,
) -> Result<(B::Device, QueueGroup<B, C>), DeviceCreationError>
where
F: Fn(&B::QueueFamily) -> bool,
C: Capability,
{
use crate::queue::QueueFamily;
let requested_family = self.queue_families.iter().find(|family| {
C::supported_by(family.queue_type()) && selector(family) && count <= family.max_queues()
});
let priorities = vec![1.0; count];
let (id, families) = match requested_family {
Some(family) => (family.id(), [(family, priorities.as_slice())]),
_ => return Err(DeviceCreationError::InitializationFailed),
};
let Gpu { device, mut queues } =
unsafe { self.physical_device.open(&families, Features::empty()) }?;
Ok((device, queues.take(id).unwrap()))
}
}